[ADO.NET] DataReader的 RecordsAffected属性 / 新增、删除、修改的 .ExecuteNonQuery()方法之传回值
原文出处:http://www.dotblogs.com.tw/mis2000lab/archive/2011/04/15/datareader_recordsaffected_20110415.aspx
建议各位还是参阅微软官方的 MSDN网站最清楚了。
资料来源: http://msdn.microsoft.com/zh-tw/library/system.data.sqlclient.sqldatareader.recordsaffected.aspx
可以作为 ASP.NET案例精编(清华大学出版社)
(上集)的 Ch. 14章 一点小小补充
RecordsAffected属性
取得 Transact-SQL 陈述式的执行所变更、插入或删除的数据列数目。
属性值
型别:System.Int32
变更、插入或删除的数据列数目;如果没有任何数据列受影响或陈述式失败,则为 0;SELECT 陈述式则为 -1。
我对上面这句话比较感兴趣。
另外他强调了三件事:
RecordsAffected属性会在所有数据列已读取,且您关闭 SqlDataReader 之后才会设定。
这个属性值为累计。例如,如果两个数据录插入于批次模式,则 RecordsAffected 的值将是二。
IsClosed
和 RecordsAffected 是在关闭 SqlDataReader 之后,您唯一可以呼叫的属性。
=========================================
<<行前练习>>
以下的范例,都使用到这个简单的观念,请参考:
初探ADO.NET #1,程序与数据库互动的四大步骤
http://www.dotblogs.com.tw/mis2000lab/archive/2008/08/15/4918.aspx
如果您没有看过书,或是对于 ADO.NET没底子,最好先把这几篇文章看完再说:
ADO.NET入门文章(书本文章公开 / 下载)#1 -- 各种基础范例
http://www.dotblogs.com.tw/mis2000lab/archive/2011/01/14/ado_net_book_sample_20110114.aspx
ADO.NET入门文章(书本文章公开 / 下载)#2 -- Stored Procedure / NextResult方法 / MARS
http://www.dotblogs.com.tw/mis2000lab/archive/2011/01/14/ado_net_book_sample_2_20010114.aspx
ADO.NET入门文章(书本文章公开 / 下载)#3 -- MARS与简单的「留言版」范例
http://www.dotblogs.com.tw/mis2000lab/archive/2011/01/14/ado_net_book_sample_3_20111114.aspx
=========================================
<<范例一>>
以前,我们都知道,撰写「新增」、「删除」、「修改」的SQL指令时,
需要使用 SqlCommand的 .ExecuteNonQuery()方法。
完成后,他会传回一个整数值,代表「这个指令影响了几列纪录」。
简单的范例如下:
'----自己(宣告)写的----
Imports System
Imports System.Web.Configuration
Imports System.Data
Imports System.Data.SqlClient
'----自己(宣告)写的----
Protected Sub Page_Load(sender As Object, e As System.EventArgs)
Handles Me.Load
'== (1). 开启数据库的连结。
Dim Conn As New SqlConnection(WebConfigurationManager.ConnectionStrings("Web.Config文件里面的DB连结字符串").ConnectionString)
Conn.Open()
'== (2). 执行SQL指令。或是查询、捞取数据。
Dim cmd As SqlCommand = New SqlCommand("Update test set title = '真珠草萃取物可以治疗肝炎 韩国技转锦鸿' where id =3", Conn)
'== (3). 自由发挥。
Dim RecordsAffected As Integer = cmd.ExecuteNonQuery()
Label1.Text= "执行 Update的SQL指令以后,影响了" & RecordsAffected & "列的纪录。"
'-- 或者是,您可以这样写,代表有更动到一些纪录。
' If RecordsAffected > 0 Then
' Response.Write("资料更动成功。共有" & RecordsAffected & "列纪录被影响。")
' End If
'== (4). 释放资源、关闭数据库的连结。
cmd.Cancel()
If (Conn.State = ConnectionState.Open) Then
Conn.Close()
Conn.Dispose()
End If
End Sub
=========================================
<<范例二>>
而 SqlDataReader的 RecordsAffected属性
在MSDN网站上有强调两件事:
'== 重点(1) IsClosed属性和 RecordsAffected属性是在关闭 SqlDataReader之后,您还可以呼叫的两个属性。
'== 重点(2) 使用Select陈述式则 RecordsAffected属性为 -1
写了一个简单范例,真的是如此。
'----自己(宣告)写的----
Imports System
Imports System.Web.Configuration
Imports System.Data
Imports System.Data.SqlClient
'----自己(宣告)写的----
Protected Sub Page_Load(sender As Object, e As System.EventArgs)
Handles Me.Load
'== (1).开启数据库的连结。
Dim Conn As New SqlConnection(WebConfigurationManager.ConnectionStrings("Web.Config文件里面的DB连结字符串").ConnectionString)
Conn.Open()
'== (2). 执行SQL指令。或是查询、捞取数据。
Dim cmd As SqlCommand = New SqlCommand("Select * From test",
Dim dr As SqlDataReader = cmd.ExecuteReader()
'== (3).自由发挥。把捞出来的纪录,呈现在画面上。
GridView1.DataSource = dr
GridView1.DataBind()
'== (4).释放资源、关闭数据库的连结。
If Not (dr Is Nothing) Then
cmd.Cancel()
dr.Close()
End If
'******************************
Label1.Text = "执行 Select 的SQL指令以后,影响了" & dr.RecordsAffected & "列的纪录。"
'== 重点(1) IsClosed属性和 RecordsAffected属性是在关闭 SqlDataReader之后,您还可以呼叫的两个属性。
'== 重点(2) 使用Select陈述式则 RecordsAffected属性为(-1)
'******************************
If (Conn.State = ConnectionState.Open) Then
Conn.Close()
Conn.Dispose()
End If
End Sub
今日值班正妹,林志玲
图片来源:
http://www.nownews.com/photo/photo.php?phid=6872#tphoto
![](http://www.nownews.com/newspic/1697/i1697432.jpg)
....................................................................................................寄信给我 mis2000lab (at)雅虎.com.台湾 ........
ASP.NET案例精编(清华大学出版社 / 作者MIS2000Lab)
http://www.china-pub.com/46063
2009/5/15上市
市场价 :¥59.80 RMB(人民幣)
![ASP.NET案例精编--适用于VS2005/2008](http://images.china-pub.com/ebook45001-50000/46063/zcover.jpg)