关于RecordsAffected 关于OdbcDataReader的RecordsAffected属性,msdn上说,更改、插入或删除的行数。对于 SELECT 语句为 -1;如果没影响任何行或该语句失败,则为 0。但是我用的时候发现,select语句能返回行数,我连的是mysql,这是为什么呢?是巧合吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没有用过mysql,估计msdn也是对mssql来解释的。 mysql没用过,应该不会吧,lz再好好看看 @lz您好:估计您使用的是在sql中进行的命令测试,由于我没有使用过oledb数据提供程序所以不好给您一个肯定的答复.但是,如果是使用SqlConnection对象相关联的SqlDataReader对象的RecordsAffected属性获取受影响的行数时,的确是-1。(特指select,另外也包括数据操作查询之外的查询).其实,个人感觉SqlDataReader.RecordsAffected属性是被SqlCommand对象的ExecuteNonQuery方法所封装起来的.何不直接使用此方法,舍近求远呢? 建议lz把相关的查询贴出即可.string query = "select ..."; 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()); } } 我用mysql客户端执行sql语句反而返回不了行数,在c#代码中返回正确的行数 @lz您好:看到您的代码中可能由于疏忽有一处错误.在VS帮助文档中曾经提到过在使用SqlDataReader对象获取查询的所受影响的行数时,必须将SqlDataReader对象关闭,以保证数据的精确性.其正确的写法为:reader.Close();Console.WriteLine(reader.RecordsAffected); 由于mysql和oledb这两个我都没有使用过,所以只能给您提供曾经使用过的东西进行说明.希望能够对您有所帮助! 你的意思是如果数据行数很大,比如N条,如果我不关闭datareader,那recordsaffect可能小于N? 还是那句话,您对于SqlDataReader的这个属性的应用是出于什么目的?仅仅是想利用它获取所影响数据的行数码?那干脆使用ExecuteNonQuery方法. 你没看仔细,我用的不是ms sql server,我的目的是读数据,并且想在取数据之前判断下有没有数据(OdbcDataReader可以用HasRows属性来判断,我实际上是用的接口,所以没有HasRows属性)。当然通过其他方法也可以判断是否有记录,这里只是对RecordsAffect这个属性感到奇怪,呵呵 RecordsAffected属性真的是挺低层的数据读取对象了. 我试了一下,发现用odbc方式连mysql能返回行数,用ado.net方式连返回的就是-1了。结贴。 加密算法,求高人指点 窗口刷新闪烁问题 请教大家看一下,C#中的lable控件的宽度怎么改变不了? 问个简单的问题啊Dreamweaver 为什么在lisbox中单击取消选中后,会自动选中第一项 添加了KeyPress事件限制了文本框內容輸入后如何獲得文本內容? 请教,如何测算一段程序运行的时间? 如何在dataGrid中加一个LinkLabel控件? C#中如何设置Excel各列的宽度 如何在两个LISTVIEW中实现拖动 服务程序与窗口程序的区别 C#打印,打不全问题(100分,不够可以再加)
估计您使用的是在sql中进行的命令测试,由于我没有使用过oledb数据提供程序所以不好给您一个肯定的答复.
但是,如果是使用SqlConnection对象相关联的SqlDataReader对象的RecordsAffected属性获取受影响的行数时,的确是-1。(特指select,另外也包括数据操作查询之外的查询).其实,个人感觉SqlDataReader.RecordsAffected属性是被SqlCommand对象的ExecuteNonQuery方法所封装起来的.何不直接使用此方法,舍近求远呢?
string query = "select ...";
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());
}
}
我用mysql客户端执行sql语句反而返回不了行数,在c#代码中返回正确的行数
看到您的代码中可能由于疏忽有一处错误.在VS帮助文档中曾经提到过在使用SqlDataReader对象获取查询的所受影响的行数时,必须将SqlDataReader对象关闭,以保证数据的精确性.
其正确的写法为:
reader.Close();
Console.WriteLine(reader.RecordsAffected);
希望能够对您有所帮助!
你的意思是如果数据行数很大,比如N条,如果我不关闭datareader,那recordsaffect可能小于N?
仅仅是想利用它获取所影响数据的行数码?那干脆使用ExecuteNonQuery方法.
你没看仔细,我用的不是ms sql server,我的目的是读数据,并且想在取数据之前判断下有没有数据(OdbcDataReader可以用HasRows属性来判断,我实际上是用的接口,所以没有HasRows属性)。
当然通过其他方法也可以判断是否有记录,这里只是对RecordsAffect这个属性感到奇怪,呵呵
结贴。