0

私は以下のコードを持っています:

if (reader.HasRows)
{
    while (reader.Read())
    {
        DataRow searchedDR = ds.Tables[dr["name"].ToString()].Rows.Find(reader["ID"].ToString());
        if (searchedDR != null)
            ds.Tables[dr["name"].ToString()].Rows.Remove(searchedDR);
    }
}

このコードブロックが正常に実行されると、データリーダー(リーダー)は空になりますか?理由は何ですか?後でこのリーダーで作業する必要があります。解決策は何ですか?

4

5 に答える 5

4

データリーダーはデータのホースです。読み取っているすべてのデータを消費すると、「空」になります(またはより良い例え:枯渇します)。

これはストレージデバイスではありません(バケットではありません)。後でデータが必要な場合は、データをどこかに保存しDataTableます。たとえば、aまたはクラスモデルです。

于 2010-01-30T13:57:30.780 に答える
3

IDataReader、読み取り専用、転送専用のデータプロバイダーを定義します。メソッドを呼び出すとRead()、前の行に戻る方法はありません。インターフェイスにはメソッドがないReset()ため、最初からやり直す唯一の方法は、データベースコマンドを再度実行することです。リーダーをデータのストリームと考えてください。次の行を要求できますが、一度読み取ると、それはなくなります。

データベースクエリの結果を数回トラバースする必要がある場合は、結果をアプリケーションメモリにキャッシュする必要があります。リーダーで最初のパスを手動で実行することもできますが、IDataAdapter代わりに使用する方がはるかに簡単です。

于 2010-01-30T13:57:19.583 に答える
1

生成されるデータの量によって異なります。あまり多くない場合は、リーダーを使用してデータを一時的なデータ構造に読み込み、両方の操作でデータ構造を反復処理できます。データが多すぎてすべてを効率的にメモリに保持できない場合は、新しいデータリーダーを作成して、コマンドを再実行するしかありません。

于 2010-01-30T13:58:58.510 に答える
1

DataReaderは順方向のみであり、一歩後退することはできません。これは、迅速な一方向のデータ読み取り操作を目的としています。

後でデータを操作する必要がある場合は、データをコピーしたDataTableを使用するか、データを再初期化する必要があります。

于 2010-01-30T14:00:42.763 に答える
1

DataReaderは、データベースクエリから返されるデータのストリームです。クエリが実行されると、最初の行がストリームを介してDataReaderに返されます。その後、ストリームはデータベースに接続されたままになり、次のレコードを取得する準備が整います。DataReaderは、データベースから一度に1行を読み取り、一度に1レコードしか先に進むことができません。DataReaderはデータベースから行を読み取るため、各行の列の値を読み取って評価することはできますが、編集することはできません。

通常、ドロップダウンやデータリピーターコントロールのバインドのように前の行に移動する必要がない場合は、datareaderado.netコントロールを使用します。軽量化を維持するために、Microsoftはデータリーダー制御の機能のみを転送します。

後で使用するには、 DataTableを使用するか、コンテンツを永続化するカスタムクラスを作成します。

出典: http ://www.techbaba.com/q/2758-why+datareader+forward+only.aspx

于 2010-01-30T14:01:08.500 に答える