以下のスキーマを見てください。
CREATE TABLE Person (id int not null identity,[index] varchar(30),datecreated datetime)
insert into Person ([index],datecreated) values ('4,5,6','2011-01-01')
insert into Person ([index],datecreated) values ('1,2,3','2011-02-02')
insert into Person ([index],datecreated) values ('7,8','2012-02-02')
そして以下のコード:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Try
Dim _ConString As String = WebConfigurationManager.ConnectionStrings("dbConnection").ConnectionString
Dim connection As New SqlConnection(_ConString)
Dim objCommand As New SqlCommand
Dim objDR As SqlDataReader
Dim sqlString As String
sqlString = "SELECT * FROM Person WHERE datecreated < '2012-01-01' "
objCommand.CommandText = sqlString & " ORDER BY left (substring([index],charindex(',',[index])+1,200), " & _
" charindex(',',substring([index],charindex(',',[index])+1,200))-1)"
objCommand.Connection = connection
connection.Open()
objDR = objCommand.ExecuteReader
If objDR.HasRows Then
MsgBox("Has Rows")
Else
MsgBox("No Rows")
End If
connection.Close()
Catch ex As Exception
End Try
End Sub
このコードは、ライブ システムの関数の一部です。ORDER BY; を使用して完全なアプリケーションを開発モード (またはライブ) で実行するときはいつでも。DataReader にはレコードがなく、No Rows というメッセージ ボックスが表示されます (これは、上記のコードを単独で実行した場合には発生しません)。ORDER BY 句をコメントアウトすると、正しい行数が返されます。スローされる例外はありません。SQLDataReader がエラーを生成したかどうかを確認する方法はありますか?
更新接続が閉じられていないなどのメモリリークや、例外が処理されないという事実についての回答を投稿しないでください。私はこれを理解しています。問題を再現するために、上記のコードを作成しました。
UPDATE2 23/05/2012 19:30 gmt さらにテストを行ったところ、パラメーター化されたクエリが使用されている場合に不一致が発生することがわかりました。つまり、コマンド オブジェクトが実行された後、SQL Studio Manager では行が返されますが、アプリケーションでは返されません。パラメータ化されたクエリがキャッシュされることは知っています。パラメータ化された実行計画がパラメータ化されていない実行計画と異なる理由はありますか?