3

DataReaderを2回繰り返す必要があります。DataSetsを使用せずに、クエリを2回実行せずにこれを行う方法はありますか?ちなみに、私はC#を使用しています。
ありがとう

4

6 に答える 6

4

簡単な答えは「いいえ」です。結果セットの列挙を実行して、完了です。おそらく実行する必要があるのは、結果をある種の単純化された生の結果にダンプして、必要なだけ反復できるようにすることです(DataSetのオーバーヘッドを回避します)。

MSDNを覗いてみると、SqlDataReaderが「転送専用」であることがわかります。これは、これが不可能であることを再度示唆しています。

于 2010-07-08T20:30:26.557 に答える
4

その前方のみのリーダー、あなたは戻ることはできません。最善の策は、データリーダーを2回繰り返すのではなく、1回の反復で実行する両方の操作を実行することです。

結果を自分でキャッシュすることもできますが、それはDataReaderの目的を破壊するようなものです。したがって、データを何度も手元に置く必要がある場合は、別の方法でデータにアクセスする必要があります。

于 2010-07-08T20:33:08.723 に答える
3

データリーダーはRead()呼び出しごとに変化するため、可能性はありますが、それほど単純ではありません。したがって、次回アクセスするには、以前の値をどこかに保存する必要があります。ここでデータセットを使用することはそれほど悪い考えではありません。

于 2010-07-08T20:32:08.633 に答える
0

仕様ではリストのIDataReaderリセットは許可されていませんが、特定の実装がそのインターフェイスの一部としてリセットコマンドを実装IEnumeratorまたは備えていることを確認してください。GetEnumerator()

于 2010-07-08T20:31:16.903 に答える
0

私はこの問題の解決策を持っています、これは最善ではないかもしれませんが、私は問題なくこれを何度も使用しました。返される行数を生成するサブクエリをselection句で作成できます。例:

SELECT productid, 
  name, 
  price, 
  (SELECT COUNT(*) FROM tblProduct WHERE categoryid=1 AND price <= 1000) 
     AS 'RowCount' 
FROM tblProduct 
WHERE categoryid=1 AND price <= 1000;
于 2018-07-24T09:05:13.410 に答える
0

ゲームの後半ですが、データセットの反復処理に役立つコードを次に示します。そして、質問に正直に言うと、これはデータリーダーではなく、一部の人が示唆しているようにデータセットです。私は1回だけ繰り返しますが、データセットを2回、または何度でも繰り返すことができます:)乾杯

..。

        StringBuilder VBAstrBldr = new StringBuilder();
        List<object> objects = new List<object>();
        string destPath = string.Empty;
        string _filePath = string.Empty;
        string timestampSuffix = string.Empty;

..。

    string commandTextDC = @" SELECT  [CategoryID]
                                    ,[AreaNo]
                                    ,[CategoryDesc]
                                    ,[CategoryNo]
                                    ,[CatCodeDisableDate]
                                    ,[CatCodeDeprecateDate]
                            FROM [dbo].[Categories] ";

..。

using (var connection = new SqlConnection(_dbLogConn))
{
    connection.Open();
    using (var tran = connection.BeginTransaction())
    {
        using (var command = new SqlCommand(commandTextDC, connection, tran))
        {
            try
            {
                var adapter = new SqlDataAdapter(command);
                DataSet thedataSet = new DataSet();
                adapter.Fill(thedataSet);

                VBAstrBldr.Clear();

                foreach (DataTable table in thedataSet.Tables)
                {
                    foreach (DataRow row in table.Rows)
                    {
                        VBAstrBldr.Append(Environment.NewLine);
                        foreach (DataColumn column in table.Columns)
                        {
                            object item = row[column];
                            // read column and item
                            VBAstrBldr.Append("columnName: " + column.ColumnName.ToString() + " Value: " + item.ToString());
                            VBAstrBldr.Append(Environment.NewLine);
                        }
                    }
                }

                _filePath = Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory);
                destPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "VBAwithDC" + timestampSuffix + ".txt");

                using (StreamWriter sw = new StreamWriter(System.IO.File.Create(destPath)))
                {
                    sw.Write(VBAstrBldr);
                }
            }
            catch (Exception Ex)
            {
                string msg = Ex.Message.ToString();
                tran.Rollback();
                throw;
            }
        }
    }
}
于 2019-09-12T18:55:07.573 に答える