关于OdbcDataReader的RecordsAffected属性,msdn上说,
更改、插入或删除的行数。对于 SELECT 语句为 -1;如果没影响任何行或该语句失败,则为 0。但是我用的时候发现,select语句能返回行数,我连的是mysql,这是为什么呢?是巧合吗?

解决方案 »

  1.   

    没有用过mysql,估计msdn也是对mssql来解释的。
      

  2.   

    mysql没用过,应该不会吧,lz再好好看看
      

  3.   

    @lz您好:
    估计您使用的是在sql中进行的命令测试,由于我没有使用过oledb数据提供程序所以不好给您一个肯定的答复.
    但是,如果是使用SqlConnection对象相关联的SqlDataReader对象的RecordsAffected属性获取受影响的行数时,的确是-1。(特指select,另外也包括数据操作查询之外的查询).其实,个人感觉SqlDataReader.RecordsAffected属性是被SqlCommand对象的ExecuteNonQuery方法所封装起来的.何不直接使用此方法,舍近求远呢?
      

  4.   

    建议lz把相关的查询贴出即可.
    string query = "select ...";
      

  5.   


     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());
                    }
                }
      

  6.   


    我用mysql客户端执行sql语句反而返回不了行数,在c#代码中返回正确的行数
      

  7.   

    @lz您好:
    看到您的代码中可能由于疏忽有一处错误.在VS帮助文档中曾经提到过在使用SqlDataReader对象获取查询的所受影响的行数时,必须将SqlDataReader对象关闭,以保证数据的精确性.
    其正确的写法为:
    reader.Close();
    Console.WriteLine(reader.RecordsAffected);
      

  8.   

    由于mysql和oledb这两个我都没有使用过,所以只能给您提供曾经使用过的东西进行说明.
    希望能够对您有所帮助!
      

  9.   


    你的意思是如果数据行数很大,比如N条,如果我不关闭datareader,那recordsaffect可能小于N?
      

  10.   

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

  11.   


    你没看仔细,我用的不是ms sql server,我的目的是读数据,并且想在取数据之前判断下有没有数据(OdbcDataReader可以用HasRows属性来判断,我实际上是用的接口,所以没有HasRows属性)。
    当然通过其他方法也可以判断是否有记录,这里只是对RecordsAffect这个属性感到奇怪,呵呵
      

  12.   

    RecordsAffected属性真的是挺低层的数据读取对象了.
      

  13.   

    我试了一下,发现用odbc方式连mysql能返回行数,用ado.net方式连返回的就是-1了。
    结贴。