检查从MySQL数据读取器返回的行数

Boa*_*rdy 1 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

下面是我获取行数的函数

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Luk*_*oid 7

使用 aDataTable加载结果,例如

DataTable dt = new DataTable();
dt.Load(reader);
int numberOfResults = dt.Rows.Count;
Run Code Online (Sandbox Code Playgroud)

然后,您还可以迭代行来读取值,例如

foreach(DataRow dr in dt.Rows)
{
    var value = dr["SomeResultingColumn"]
}
Run Code Online (Sandbox Code Playgroud)

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


Jan*_*rck 5

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

SELECT COUNT(*) AS TotalNORows, * FROM reports, software, platforms, versions etc
Run Code Online (Sandbox Code Playgroud)