0

SQL 文字列 + パラメータを使用してページ クエリ (SQL Server) を返そうとすると、PetaPoco で非常に奇妙な問題に直面しています。単純な SQL 文字列を使用すると、期待どおりに結果セットが返されます。@0 パラメーターで文字列を使用すると、発行された SQL コマンドを調べても、resulset は返されません...

ここにクエリがあります

Dim query As PetaPoco.Sql = New PetaPoco.Sql("SELECT DISTINCT UserName FROM EVA_Users WHERE UserName LIKE '@0%' ORDER BY UserName", filterSql)
Dim result As PetaPoco.Page(Of AutoCompleteUserName) = db.Page(Of AutoCompleteUserName)(1, rowsNumber, query)

これにより、@0 の文字列パラメーターとして "filterSql" を使用してコマンドを発行する必要があり、実際にはカウントに対して発行される SQL コマンドは次のとおりです。

SQL Command: SELECT COUNT(DISTINCT UserName) FROM EVA_Users WHERE UserName LIKE '@0%' -> @0 [String] = "tes"

ページインは次のとおりです。

SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY UserName) peta_rn, peta_inner.* FROM (SELECT DISTINCT UserName FROM EVA_Users WHERE UserName LIKE '@0%' ) peta_inner) peta_paged WHERE peta_rn>@1 AND peta_rn<=@2 -> @0 [String] = "tes" -> @1 [Int64] = "0" -> @2 [Int64] = "10"

しかし、デバッガーを使用すると、このシナリオでそれを確認できます result.Items.Count = 0

代わりに、パラメーターを使用せずにプレーンな SQL 文字列を使用すると、期待どおりに機能します。

Dim query As PetaPoco.Sql = New PetaPoco.Sql(String.Format("SELECT DISTINCT UserName FROM EVA_Users WHERE UserName LIKE '{0}%' ORDER BY UserName", filterSql))

また、SQL string+Params をクエリで直接使用してバージョンを試しましたが、追加の利点はありませんでした。

Dim result As PetaPoco.Page(Of AutoCompleteUserName) = db.Page(Of AutoCompleteUserName)(1, rowsNumber, query (with the @0 inside as a parameter), filterSql)

DTO AutoCompleteUser はこれで、さらにいくつかのフィールドを持つテーブルから取得されます。ここから、1 つのフィールドだけでこの dto を作成しました。

Imports PetaPoco

Namespace Eva.Entities.Core
<TableName("EVA_Users")> _
<PrimaryKey("", autoIncrement:=False)> _
<ExplicitColumns> _
<Serializable()> _
Partial Public Class AutoCompleteUserName
    Private mUserName As String
    <Column> _
    Public Property UserName As String
        Get
            Return mUserName
        End Get
        Set(value As String)
            mUserName = value
        End Set
    End Property
End Class
End Namespace

ヒントはありますか?パラメータ化されたバージョンを使用して、SQL インジェクション シナリオを処理しないようにしたいと考えています。前もって感謝します

4

1 に答える 1