DataReaderを2回繰り返す必要があります。DataSetsを使用せずに、クエリを2回実行せずにこれを行う方法はありますか?ちなみに、私はC#を使用しています。
ありがとう
6 に答える
簡単な答えは「いいえ」です。結果セットの列挙を実行して、完了です。おそらく実行する必要があるのは、結果をある種の単純化された生の結果にダンプして、必要なだけ反復できるようにすることです(DataSetのオーバーヘッドを回避します)。
MSDNを覗いてみると、SqlDataReaderが「転送専用」であることがわかります。これは、これが不可能であることを再度示唆しています。
その前方のみのリーダー、あなたは戻ることはできません。最善の策は、データリーダーを2回繰り返すのではなく、1回の反復で実行する両方の操作を実行することです。
結果を自分でキャッシュすることもできますが、それはDataReaderの目的を破壊するようなものです。したがって、データを何度も手元に置く必要がある場合は、別の方法でデータにアクセスする必要があります。
データリーダーはRead()呼び出しごとに変化するため、可能性はありますが、それほど単純ではありません。したがって、次回アクセスするには、以前の値をどこかに保存する必要があります。ここでデータセットを使用することはそれほど悪い考えではありません。
仕様ではリストのIDataReader
リセットは許可されていませんが、特定の実装がそのインターフェイスの一部としてリセットコマンドを実装IEnumerator
または備えていることを確認してください。GetEnumerator()
私はこの問題の解決策を持っています、これは最善ではないかもしれませんが、私は問題なくこれを何度も使用しました。返される行数を生成するサブクエリを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;
ゲームの後半ですが、データセットの反復処理に役立つコードを次に示します。そして、質問に正直に言うと、これはデータリーダーではなく、一部の人が示唆しているようにデータセットです。私は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;
}
}
}
}