关于RecordsAffected

ICanUseThisID 2010-05-19 05:19:31
关于OdbcDataReader的RecordsAffected属性,msdn上说,
更改、插入或删除的行数。对于 SELECT 语句为 -1;如果没影响任何行或该语句失败,则为 0。

但是我用的时候发现,select语句能返回行数,我连的是mysql,这是为什么呢?是巧合吗?

...全文
450 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
ICanUseThisID 2010-05-21
  • 打赏
  • 举报
回复
我试了一下,发现用odbc方式连mysql能返回行数,用ado.net方式连返回的就是-1了。
结贴。
shixiujin 2010-05-20
  • 打赏
  • 举报
回复
RecordsAffected属性真的是挺低层的数据读取对象了.
shixiujin 2010-05-20
  • 打赏
  • 举报
回复
如果仅仅是想在读取数据之前判断是否读到数据的话,可以使用一个参数进行测试.
shixiujin 2010-05-20
  • 打赏
  • 举报
回复
使用的是IDataReader接口吗?
ICanUseThisID 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 shixiujin 的回复:]

还是那句话,您对于SqlDataReader的这个属性的应用是出于什么目的?
仅仅是想利用它获取所影响数据的行数码?那干脆使用ExecuteNonQuery方法.
[/Quote]

你没看仔细,我用的不是ms sql server,我的目的是读数据,并且想在取数据之前判断下有没有数据(OdbcDataReader可以用HasRows属性来判断,我实际上是用的接口,所以没有HasRows属性)。
当然通过其他方法也可以判断是否有记录,这里只是对RecordsAffect这个属性感到奇怪,呵呵
shixiujin 2010-05-19
  • 打赏
  • 举报
回复
还是那句话,您对于SqlDataReader的这个属性的应用是出于什么目的?
仅仅是想利用它获取所影响数据的行数码?那干脆使用ExecuteNonQuery方法.
ICanUseThisID 2010-05-19
  • 打赏
  • 举报
回复
恩,我自己测下
shixiujin 2010-05-19
  • 打赏
  • 举报
回复
如果您对于该方法有疑问的话,请使用帮助文档进行求证!
shixiujin 2010-05-19
  • 打赏
  • 举报
回复
不能进行确定,因为没有进行测试过,所以不好说.
ICanUseThisID 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 shixiujin 的回复:]

不知lz是否看了上帖?
[/Quote]

你的意思是如果数据行数很大,比如N条,如果我不关闭datareader,那recordsaffect可能小于N?
shixiujin 2010-05-19
  • 打赏
  • 举报
回复
由于mysql和oledb这两个我都没有使用过,所以只能给您提供曾经使用过的东西进行说明.
希望能够对您有所帮助!
shixiujin 2010-05-19
  • 打赏
  • 举报
回复
不知lz是否看了上帖?
shixiujin 2010-05-19
  • 打赏
  • 举报
回复
@lz您好:
看到您的代码中可能由于疏忽有一处错误.在VS帮助文档中曾经提到过在使用SqlDataReader对象获取查询的所受影响的行数时,必须将SqlDataReader对象关闭,以保证数据的精确性.
其正确的写法为:
reader.Close();
Console.WriteLine(reader.RecordsAffected);
ICanUseThisID 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 shixiujin 的回复:]

@lz您好:
估计您使用的是在sql中进行的命令测试,由于我没有使用过oledb数据提供程序所以不好给您一个肯定的答复.
但是,如果是使用SqlConnection对象相关联的SqlDataReader对象的RecordsAffected属性获取受影响的行数时,的确是-1。(特指select,另外也包括数据操作查询之外的查询).

其实,个人感觉SqlDataReader.Records……
[/Quote]

我用mysql客户端执行sql语句反而返回不了行数,在c#代码中返回正确的行数
ICanUseThisID 2010-05-19
  • 打赏
  • 举报
回复

using (OdbcConnection cnn = new OdbcConnection())
{
cnn.ConnectionString = "SomeConnectionString";
cnn.Open();

OdbcCommand cmd = cnn.CreateCommand();
cmd.CommandText = "select * from SomeTable";
using (OdbcDataReader reader = cmd.ExecuteReader())
{
MessageBox.Show(reader.RecordsAffected.ToString());
}
}
shixiujin 2010-05-19
  • 打赏
  • 举报
回复
建议lz把相关的查询贴出即可.
string query = "select ...";
wuyq11 2010-05-19
  • 打赏
  • 举报
回复
贴出相关代码
shixiujin 2010-05-19
  • 打赏
  • 举报
回复
@lz您好:
估计您使用的是在sql中进行的命令测试,由于我没有使用过oledb数据提供程序所以不好给您一个肯定的答复.
但是,如果是使用SqlConnection对象相关联的SqlDataReader对象的RecordsAffected属性获取受影响的行数时,的确是-1。(特指select,另外也包括数据操作查询之外的查询).

其实,个人感觉SqlDataReader.RecordsAffected属性是被SqlCommand对象的ExecuteNonQuery方法所封装起来的.何不直接使用此方法,舍近求远呢?
皇城龙三 2010-05-19
  • 打赏
  • 举报
回复
楼主把代码贴出来看看呢
mayonglong 2010-05-19
  • 打赏
  • 举报
回复
mysql没用过,应该不会吧,lz再好好看看
加载更多回复(3)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧