1

我目前正在处理一个 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;
    }
}
4

9 回答 9

6

使用 aDataTable来加载您的结果,例如

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 语句的执行之间插入记录。

于 2014-02-20T13:31:40.573 回答
5

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

SELECT COUNT(*) AS TotalNORows, * FROM reports, software, platforms, versions etc
于 2014-02-20T13:49:13.863 回答
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......







                    }
于 2014-02-23T04:03:08.133 回答
1

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

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

int rowcount = 0;
while(reader.Read()){
 rowcount++;
}
于 2017-09-22T17:25:41.737 回答
1

首先,创建这个类:

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();
于 2019-02-28T14:20:41.673 回答
0

也许你可以反过来看

  • 你可以做一个选择计数(*)并获取行数

或者

  • 使用数据适配器填充容器(如 DataTable)并计算行数
于 2014-02-17T19:21:10.120 回答
0

不幸的是,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

于 2014-12-08T10:05:21.863 回答
-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)
于 2014-02-17T19:20:22.607 回答
-2
OleDbDataReader dbreader = new OleDbDataReader();
int intcount = 0;
if (dbreader.HasRows == true)
{
    if (dbreader.Read())
    {
    intcount = dbreader.RecordsAffected;
    }
}

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

于 2014-02-21T10:32:31.240 回答