1

以下のスキーマを見てください。

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 では行が返されますが、アプリケーションでは返されません。パラメータ化されたクエリがキャッシュされることは知っています。パラメータ化された実行計画がパラメータ化されていない実行計画と異なる理由はありますか?

4

2 に答える 2

2

ORDER BYキーへの行の射影が失敗する行を省略すると思われます。たとえば、その順序で、部分文字列を含む多くの文字列操作を使用しています。部分文字列の引数が文字列の範囲外にある場合はどうなりますか?

試してみることをお勧めします:

SELECT [insert order by projection here] FROM Person

そこで何が起こるかを見てください- 方程式から ORDER BY を削除します。また、コードで実験するのではなく、SQL Management Studio (または何でも) からこれを行うことをお勧めします:)

于 2012-05-22T19:56:58.410 に答える
1

さらに調査するには、SQL プロファイラーを使用することをお勧めします。アプリケーションからの正確なクエリを確認できるだけでなく、SQL クエリ プランに加えて、生成される可能性がある (ただし返されない) エラーを返すことができます。

于 2012-05-23T18:43:54.680 に答える