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