1

私は現在 C# プロジェクトに取り組んでおり、MySQL Data Reader から返される行数を取得しようとしています。

直接関数がないことを知っているので、自分で作成しようとしています。この関数では、オブジェクトを渡しMySQLDataReader、MySQL Data Reader をループしてカウンターをインクリメントし、カウンターの値を返します。

これにより、プログラムがロックされているように見えます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

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 に答える
0

たぶん、あなたは物事を逆に見ることができます

  • select count(*) を実行して、行数を取得できます

また

  • データ アダプターを使用してコンテナー (DataTable など) を満たし、行をカウントする
于 2014-02-17T19:21:10.120 に答える
-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 に答える