检查从MySQL Data Reader返回的行数

时间:2014-02-17 19:13:37

标签: c# mysql mysqldatareader

我目前正在开发一个C#项目,我正在尝试从MySQL Data Reader返回的行数。

我知道没有直接的功能,所以我想写自己的。在函数中,我将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;
    }
}

9 个答案:

答案 0 :(得分:5)

为了避免多次查询,如何在选择本身中包含总数?

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

答案 1 :(得分:3)

使用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语句。

答案 2 :(得分:1)

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

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

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......







                    }

答案 3 :(得分:1)

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

MySqlCommand cmd = new MySqlCommand(query, connection);
MySqlDataReader reader = cmd.ExecuteReader();

int rowcount = 0;
while(reader.Read()){
 rowcount++;
}

答案 4 :(得分:0)

也许你可以反过来看待事情

  • 您可以执行选择计数(*)并获取行数

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

答案 5 :(得分:0)

来自Jan Van @Herck的不幸解决方案只返回一行,所以如果您有兴趣将所有行及其编号放在一个选择中,这不是您所需要的。

在这种情况下,我建议你试试这个:  select *,(从my_table中选择count(*))来自my_table的AS numRow;

或读到这个: Getting total mysql results returned from query with a limit: FOUND_ROWS error

答案 6 :(得分:0)

首先,创建此类:

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

答案 7 :(得分:-1)

您可以使用以下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)

答案 8 :(得分:-1)

OleDbDataReader dbreader = new OleDbDataReader();
int intcount = 0;
if (dbreader.HasRows == true)
{
    if (dbreader.Read())
    {
    intcount = dbreader.RecordsAffected;
    }
}

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