【问题标题】:Parametrized SQL query returns no results, String formatted query returns correct results参数化 SQL 查询不返回结果,字符串格式查询返回正确结果
【发布时间】:2014-03-11 20:20:42
【问题描述】:

我有一个 SQL 表,我试图从中搜索与用户提供的动态搜索字符串匹配的订单,然后用结果填充 OrderDataTable。这是 C# 代码:

CmdString = "SELECT * FROM SQL_TABLE WHERE (CHARINDEX('@searchstring', ordernumber) > 0 OR CHARINDEX('@searchstring', customername) > 0)"

using (SqlConnection conn = new SqlConnection(ConnectionString))
{
    using (SqlCommand comm = new SqlCommand())
    {
        comm.Connection = conn;

        comm.Parameters.AddWithValue("@searchstring", OrderDisplayViewModel.SearchString);

        comm.CommandText = CmdString;

        using (SqlDataAdapter sda = new SqlDataAdapter(comm))
        {
            using (DataTable tempdatatable = new DataTable())
            {
                sda.Fill(tempdatatable);
                OrderDataTable.Merge(tempdatatable);
            }
        }
    }
}

即使对于我在 SSMS 中运行的返回大量结果的查询,这也不会返回任何结果。此外,当我删除参数化并将 @searchstring 替换为搜索框中的文本时,查询功能正常。我不想让应用程序打开注入,但我无法弄清楚我使用参数的方式有什么问题。

【问题讨论】:

  • 我认为单引号会杀死您的参数化查询。这就是为什么您的 SQL 将其视为 字符串文字,而不是参数。
  • 你调试过它并将鼠标悬停在 OrderDisplayViewModel.SearchString 上吗?
  • @Marc 比你早 11 秒得到它。就是这样——那些单引号在双引号旁边是如此不可见,以至于我只是在它们上面上釉。非常感谢。

标签: c# sql .net tsql


【解决方案1】:

你的意思是:

CHARINDEX(@searchstring, ordernumber)

不是

CHARINDEX('@searchstring', ordernumber)

(同样customername

@searchstring是参数; '@searchstring' 是一个文字字符串,包含以@ 开头并以g 结尾的13 个字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 2011-04-28
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多