1

シナリオはこれです。datatable.loadを使用してsqldatareaderをデータテーブルに変換しようとすると、何も返されないように見えるsqldatareaderクエリがあります。

だから私はそれをデバッグし、それが正しくフォーマットされていることを確認するために、それが sqldatareader に入る前に詳細な SQL クエリを取得します。これをコピーして SQL サーバーに貼り付けて実行し、何かが返されるかどうかを確認します。1行です。

Visual Studio に戻ってプログラムを続行し、データ テーブルを作成して sqldatareader を読み込もうとしましたが、空のリーダーが返されました。何が起こっているのか当惑しています。

ここにコードのバージョンをコピーします (使用している正確な SQL クエリではありませんが、閉じます)。

Dim cn As New SqlConnection
cn.ConnectionString = <connection string details here>
cn.Open()
Dim sqlQuery As String = "select * from Products where productid = 5"
Dim cm As New SqlCommand(sqlQuery, cn)
Dim dr As SqlDataReader = cm.ExecuteReader()

Dim dt as new DataTable
dt.load(dr)

dt にはコンテンツが必要ですが、空です。その SQL クエリを SQL サーバーにコピーして実行すると、結果の行が得られます。

私が間違っていることはありますか?

######### アップデート ############

各 SQL クエリで取得するよりも 1 行少ないように見えることに気付きました。そのため、自分で SQL を実行して 1 行を取得すると、データテーブルには 0 行あるように見えます。クエリが 4 行を返す場合、データテーブルは 3 です!! 非常に奇妙です、何かアイデアはありますか?

######## さらに更新 ############

わかりました datatable.load メソッドを使用する前に、datareader の行をカウントするループを実行しました。私のテストクエリでは、datatable.load メソッドを使用するとすぐに datareader に 4 行 (正しい量) が表示されます。データテーブルが空であると表示されます。

###### Ok

したがって、データリーダーは一方向のものであり、それを繰り返して行数を取得すると、他のコードに関する限り、本質的に空です。それが転送のみであり、一度読んだら「リセット」されないことに気づきませんでした。

4

1 に答える 1

1

この行をdt.load(dr)の上に挿入し、デバッグウィンドウで値を確認します。

Debug.WriteLine("Datareader has rows: " & dr.HasRows)

また、cm.ExecuteReader()を次のように変更して、接続が閉じていることを確認してください。

cm.ExecuteReader(CommandBehavior.CloseConnection);
于 2010-04-06T17:58:39.573 に答える