0

在尝试使用 sql 字符串 + 参数返回分页查询(SQL Server)时,我遇到了 PetaPoco 的一个非常奇怪的问题。如果我只使用一个普通的 SQL 字符串,它会按预期返回结果集。如果我使用带有@0 参数的字符串,则不会返回任何结果集,即使我检查发出的 SQL 命令也是正确的......

这是查询

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)

这应该发出一个带有“filterSql”作为@0 的字符串参数的命令,非常简单,实际上为计数发出的 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 就是这个,它来自一个包含更多字段的表,我从那里创建了这个只有一个字段的 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

1

您需要将%参数值而不是sql。参数也不应该用单引号引起'来。例如。

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)
于 2013-07-21T23:21:44.607 回答