4

プロジェクトを odbc.datareader から mysql.datareader に切り替えることに成功しました。問題は、最初の /odbc datareader) では、AffectedRows プロパティが純粋なクエリの場合でも行数を正しく取得することです。しかし、それは mysql.datareader で動作し、その場合は -1 です。したがって、行数、つまり「結果ビュー」を取得する方法がわかりません。編集: 前方のみのリーダーは知っていますが、理解できないのは次のとおりです: 行 DBreader=command.ExecuteRader() にブレークポイントを配置すると、DBreader が - 結果ビューで - 行と同じ数のオブジェクトを持っていることがわかりますする必要があります。走った直後にそれがわかるのはどうしてですか?ありがとうございました

4

4 に答える 4

3

DataReader に行数が含まれていない理由は、計算に非常にコストがかかる可能性があるためです。たとえば、今年入力され、削除されていない注文書を返すクエリを実行するとします。

SELECT * FROM PurchaseOrders 
WHERE PurchaseDt > '2009-01-01'
AND IsDeleted = 0

そして、このクエリを DataReader で使用して、最初の 10 行を読み取ります。SQL Server は、要求に応じてクライアントに行を "ストリーミング" します。別の行を要求すると、SQL Server はクエリの次のステップを実行します。そのため、実際にすべての行を読み取る前に、SQL Server でさえ行の総数を認識していません。

于 2009-11-14T10:14:29.080 に答える
2

テーブル内の行数をカウントするには (たとえば、名前は studentTable です)、まず次の SQL ステートメントを使用します。

SELECT COUNT(*) FROM studentTable

このステートメントを MySqlCommand オブジェクトのコマンド テキストとして使用します。

次に、MySqlDataReader のオブジェクト (たとえば、その名前はリーダー) を使用して値 (行数) を知るには、次のコードを使用します。

reader.GetString(0);

以下は私が使用するコードです:

...            
MySqlConnection conn = new MySqlConnection(connString);
MySqlCommand command = conn.CreateCommand();
command.CommandText = "SELECT COUNT(*) FROM studentTable";
try
{
    conn.Open();
}
catch (Exception ex)
{
    label1.Content = ex.Message;
}

reader = command.ExecuteReader();
while (reader.Read())
{
    label1.Content = "";
    label1.Content = reader.GetString(0);
}

reader.Close();
conn.Close();
于 2012-06-16T15:06:14.573 に答える
0

以下は私が使っている関数です。必要に応じて自由に調整してください。

    /// <summary>
    /// Counts the number of rows in a given table.
    /// </summary>
    /// <param name="tableName">The name of the table to query.</param>
    /// <param name="closeConnectionWhenDone">A flag indicating whether the connection should be closed once the query is executed.</param>
    /// <returns>The number of rows in the table.</returns>
    private static int GetNumRowsInTable(string tableName, bool closeConnectionWhenDone = false)
    {
        string selectQueryString = String.Format("select 1 from {0};", tableName);
        int numRows = 0;
        CommandBehavior behavior = closeConnectionWhenDone ? CommandBehavior.CloseConnection : CommandBehavior.Default;
        using (var command = new OdbcCommand(selectQueryString, ODBCHelper.Connection))
        using (var reader = command.ExecuteReader(behavior))
        {
            while (reader.Read())
            {
                numRows++;
            }
        }

        return numRows; 
    }
于 2011-03-08T16:46:57.953 に答える