【问题标题】:Checking the number of rows returned from MySQL Data Reader检查从 MySQL 数据读取器返回的行数
【发布时间】:2014-02-17 19:13:37
【问题描述】:

我目前正在处理一个 C# 项目,我正在尝试获取从 MySQL 数据读取器返回的行数。

我知道没有直接函数,所以我正在尝试编写自己的函数。在函数中,我将MySQLDataReader 对象传递给它,然后循环通过MySQL 数据读取器并增加一个计数器并返回计数器的值。

这似乎锁定了程序,我猜是因为我是Reader.read(),在我得到计数​​之后我已经在最后了。相反,我尝试创建阅读器的副本,然后遍历临时版本,但我得到了相同的结果。

下面是我执行查询和调用函数的代码。

string query = "SELECT * FROM reports, software, platforms, versions "
                        + "WHERE EmailVerified = @verified AND reports.SoftwareID = software.id AND reports.PlatformID = platforms.id "
                        + "AND reports.VersionID = versions.id AND BugReportAcceptedNotificationSent = @notificationSent";
using (MySqlCommand cmd = new MySqlCommand(query, db.conn))
{
    cmd.Parameters.AddWithValue("@verified", "1");
    cmd.Parameters.AddWithValue("@notificationSent", "0");
    using (MySqlDataReader reader = cmd.ExecuteReader())
    {
        totalEmails = HelperClass.totalRowsInMySQLDataReader(reader);
        while (reader.Read())
        {
            currentEmailCount++;
            EmailNotifications emailNotification = new EmailNotifications(reader);
            emailNotification.sendNewBugReportAfterVerificationEmail(currentEmailCount, totalEmails);
        }
    }
}

下面是我获取行数的函数

public static int totalRowsInMySQLDataReader(MySqlDataReader reader)
{
    MySqlDataReader tempReader = reader;
    ILibraryInterface library = GeneralTasks.returnBitsLibrary(Configuration.databaseSettings, Configuration.engineConfig.logFile);
    string methodInfo = classDetails + MethodInfo.GetCurrentMethod().Name;
    try
    {
        int count = 0;
        while (tempReader.Read())
        {
            count++;
        }
        tempReader = null;
        return count;
    }
    catch (Exception ex)
    {
        string error = string.Format("Failed to get total rows in MySQL Database. Exception: {0}", ex.Message);
        library.logging(methodInfo, error);
        library.setAlarm(error, CommonTasks.AlarmStatus.Medium, methodInfo);
        return -1;
    }
}

【问题讨论】:

    标签: c# mysql mysqldatareader


    【解决方案1】:

    使用DataTable 加载结果,例如

    DataTable dt = new DataTable();
    dt.Load(reader);
    int numberOfResults = dt.Rows.Count;
    

    然后您还可以遍历行以读取值,例如

    foreach(DataRow dr in dt.Rows)
    {
        var value = dr["SomeResultingColumn"]
    }
    

    另一种选择是发出两个单独的 SQL 语句,但是您需要确保两个语句都包含在具有 Serializable 隔离级别的事务中,这是确保在执行之间不插入记录所必需的两条 SQL 语句。

    【讨论】:

    • 应该是dt.Rows.Count
    【解决方案2】:

    为避免多次查询,是否将总数包含在选择本身中?

    SELECT COUNT(*) AS TotalNORows, * FROM reports, software, platforms, versions etc
    

    【讨论】:

    • 感谢您的帮助。不错的解决方案
    • 这不适用于 ;您必须指定列。即使这样,下面彼得的观点也是正确的——这只会返回一行。 -- 编辑:或将 * 放在计数之前()。
    • 听起来很愚蠢,但这并不能回答问题。
    【解决方案3】:

    我认为不执行另一个命令是不可能的...因为阅读器类中没有可用于计数的方法

    你可以试试这个...如果它有效..

    string query = "SELECT * FROM reports, software, platforms, versions "
                        + "WHERE EmailVerified=@verified AND reports.SoftwareID=software.id AND reports.PlatformID=platforms.id "
                        + "AND reports.VersionID=versions.id AND BugReportAcceptedNotificationSent=@notificationSent";
                    using (MySqlCommand cmd = new MySqlCommand(query, db.conn))
                    {
                        cmd.Parameters.AddWithValue("@verified", "1");
                        cmd.Parameters.AddWithValue("@notificationSent", "0");
    
    
                        using (MySqlDataReader reader = cmd.ExecuteReader())
                        {
    
    
                      // create a new connection db.conn2 then  
                      MySqlCommand cmd2 = new MySqlCommand(query, db.conn2))
                       cmd2.Parameters.AddWithValue("@verified", "1");
                       cmd2.Parameters.AddWithValue("@notificationSent", "0");
                         MySqlDataReader reader2 = cmd2.ExecuteReader();
                         int numberofrow=0;
                        while(reader2.Read())
                         numberofrow++;
    
    
                             //your codes......
    
    
    
    
    
    
    
                        }
    

    【讨论】:

      【解决方案4】:

      正在解决同样的问题。如果方法已经可用,我讨厌必须迭代,但这是我能想到的最短的一点:

      MySqlCommand cmd = new MySqlCommand(query, connection);
      MySqlDataReader reader = cmd.ExecuteReader();
      
      int rowcount = 0;
      while(reader.Read()){
       rowcount++;
      }
      

      【讨论】:

        【解决方案5】:

        首先,创建这个类:

        public static class Extensions
        {
            public static int Count(this MySqlDataReader dr)
            {
                int count = 0; 
                while(dr.Read())
                    count++;
        
                return count;
            }
        }
        

        这将在 MySqlDataReader 上实现 .Count ()。

        int count = reader.Count();
        

        示例:

        string sql=  "SELECT * FROM TABLE";
        MySqlCommand cmd = new MySqlCommand(sql, connection);
        MySqlDataReader reader = cmd.ExecuteReader();
        int count = reader.Count();
        

        【讨论】:

          【解决方案6】:

          也许你可以反过来看

          • 你可以只做一个 select count(*) 并获取行数

          • 使用数据适配器填充容器(如 DataTable)并计算行数

          【讨论】:

          • 谢谢我试图避免做多个查询,即一个 SELECT COUNT(*) 然后我的实际 SELECT,我会试试 DataTable
          【解决方案7】:

          不幸的是,Jan Van @Herck 的解决方案将只返回一行,因此如果您有兴趣在一次选择中获取所有行及其编号,这不是您所需要的。

          在这种情况下,我建议你试试这个: select * , (select count(*) from my_table) AS numRow from my_table;

          或阅读以下内容: Getting total mysql results returned from query with a limit: FOUND_ROWS error

          【讨论】:

          • 请注意,由于某种原因,计数前的 * 有效,而计数后的 * 失败——尽管您可以在那里指定列。
          【解决方案8】:

          您可以使用以下 SQL 查询来获取总行数。

          SELECT COUNT(*) FROM [MYTABLE]
          

          您可以从代码中使用ExecuteScalar() 方法获取QUERY 返回的总行数。

          试试这个:

          int GetRowsCount(MySqlCommand command)
          {    
          int rowsCount=Convert.ToIn32(command.ExecuteScalar());
          return rowsCount;    
          }
          

          使用上面的函数如下:

          MySqlCommand command=new MySlCommand("Select count(*) from MyTable",connectionObj);
          int totalRows = GetRowsCount(command)
          

          【讨论】:

          • 谢谢我试图避免做多个查询,即一个 SELECT COUNT(*) 然后我的实际 SELECT
          • 这不是他们要求的。
          【解决方案9】:
          OleDbDataReader dbreader = new OleDbDataReader();
          int intcount = 0;
          if (dbreader.HasRows == true)
          {
              if (dbreader.Read())
              {
              intcount = dbreader.RecordsAffected;
              }
          }
          

          “dbreader.RecordsAffected”将为您提供最后一条 SQL 语句更改、插入或删除的行数

          【讨论】:

          • 这不能回答我的问题,我正在执行 SELECT 并且需要获取返回的行数,正如您所说的,这是用于数据库修改查询
          • 我想我看到 RecordsAffected 仅在结果集关闭后才更新 - 除了它仅适用于更改的行之外,还有一个问题。
          猜你喜欢
          • 2011-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-01
          • 1970-01-01
          • 2022-01-27
          • 2016-05-05
          相关资源
          最近更新 更多