最後のレコードかどうかを確認する方法はありますか? ありがとう
6 に答える
このパターンを使用して、結果の最後の行を識別して処理します。
if (reader.Read())
{
var loop = true;
while (loop)
{
//1. Here retrive values you need e.g. var myvar = reader.GetBoolean(0);
loop = reader.Read();
if (!loop)
{
//You are on the last record. Use values read in 1.
//Do some exceptions
}
else {
//You are not on the last record.
//Process values read in 1., e.g. myvar
}
}
}
「後は無い」以外はNo. これは、行をバッファリングし、読み取りを試行し、バッファリングされたデータが最後であることが判明した場合はそれを確認する必要があることを意味する場合があります。
多くの場合、データが中程度で、何らかのオブジェクト モデルを構築している場合、構築されたデータを確認するだけで済みます。つまりList<T>
、リーダーを使用してすべての行を作成し、その後、最後の行を確認します。リストで。
を反復処理するにはSqlDataReader
:
SqlDataReader reader = ...;
while(reader.Read())
{
// the reader will contain the current row
}
最後の行だと読者に伝えるものは何もありません。最後の行を取得する必要がある場合は、おそらく行のデータを別の変数に格納して、ループを終了した後にそのデータを取得できます。
他の選択肢は次のとおりです。
- データを DataSet/DataTable に取得する
- リスト/配列にデータを格納する
- 最初の行が目的の行になるように、逆の順序でデータを取得します (クエリを書き直します)。
別の可能性は、情報をデータセットに入れることです。
クエリを使用してデータを読み取っています。q としましょう。代わりに次のクエリを使用してください。
select row_number() over (order by (select NULL)) as seqnum,
count(*) over (partition by null) as numrecs
q.*,
from (<q>) q
order by seqnum
最後のレコードには seqnum = numrecs があり、アプリケーションでテストできます。
ところで、これはデータを順不同で取得していることを前提としています。順序付けが必要な場合は、row_number() の「order by」句に基準を入れます。
ご存じのとおり、SQLDataReader には「行数」プロパティがありません。EOFまで読むだけです。
ただし、DataSetは. おそらく、DataAdapter とある種のデータ セットまたはテーブルを置き換えることができます。
つまり、レコードを 2 回フェッチするということを繰り返さないと、これを行うことはできません。ここに短い方法があります
System.Data.DataTable dt = new System.Data.DataTable();
dt.Load(myDataReader);
int recordCount = dt.Rows.Count;
if(recordCount > 0)
{
if(dt.Rows[recordCount-1]["username"] == "wrong value")
throw new Exception("wrong value");
}
私はこれをオフハンドで書いたのでテストされていませんが、それがアプローチです