为什么我的参数化查询不起作用?

时间:2010-06-28 18:56:27

标签: c# tsql .net-3.5

我有一个复杂的查询,基本上我在大多数字段中搜索数据库中的字符串或字符串。如果它是多个字符串,则数据库字段必须匹配字符串的所有部分。

这是构建查询的基本sql:

SELECT wo.ID, {columns} FROM tblWorkOrder wo
    LEFT JOIN tblWorkOrderCategory wc
    ON wo.CategoryID = wo.ID
    LEFT JOIN tblTenant t
    ON wo.TenantID = t.ID
    LEFT JOIN tblProperty p
    ON wo.PropertyID = p.ID
    LEFT JOIN tblRentalUnit ru
    ON wo.UnitID = ru.ID 

列替换为此列表:

            "wo.Date", "wo.WorkDesc", "wo.Priority", "wo.WorkDoneBy", "wo.EstimatedCost", "wo.DueDate", "wo.ActualCost", "wo.FinishedDate", "wo.workOrderNum",
            "wc.[Description]",
            "t.TenantName",
            "p.PropertyName",
            "ru.UnitNumber"

这就是我构建查询的方式:

        String[] parts = txtSearch.Text.Split(' ');
        foreach (String column in columnsToSearch) {
            String clause = " (";
            for (int i = 0; i < parts.Length; i++) {
                clause += column + " LIKE '%@param" + i + "%' ";
                if (i + 1 != parts.Length) {
                    clause += "AND ";
                }
            }
            clause = clause.TrimEnd() + ") ";
            sql += clause + " OR ";
        }
        sql = sql.TrimEnd(new char[] { 'O', 'R', ' ' });

        using (SqlConnection conn = new SqlConnection(RentalEase.Properties.Settings.Default.RentalEaseConnectionString)) {
            SqlCommand command = new SqlCommand(sql, conn);

            for (int i = 0; i < parts.Length; i++) {
                command.Parameters.Add("@param" + i, SqlDbType.NVarChar).Value = parts[i];
                //command.CommandText = command.CommandText.Replace("@param" + i, parts[i]);
            }

只有这个总是不返回任何行。但是,在指定参数值的for循环中,如果我注释掉Parameters.Add行并取消注释它下面的那一行,我最后得到的结果就像我应该看到的那样。由于这是一种不安全的方法,我想知道为什么使用参数失败。

2 个答案:

答案 0 :(得分:2)

您正在寻找文字 '@Param';你的意思是:

... LIKE '%' + @param" + i + " + '%' ...

以便TSQL为:

... LIKE '%' + @param2 + '%' ...

或更简单;将'%'放入调用代码中的值;那么你的代码就变成了:

... LIKE @param" + i + " ...

并且TSQL变为:

... LIKE @param2 ...

答案 1 :(得分:1)

使用SQL事件探查器 - 您将确切地看到发送到SQL Server的内容,包括您的所有参数及其值。

将其复制并粘贴到SQL Server Mgmt Studio中并运行它 - 我相信你会发现造成这个问题的原因......或者如果没有,你可以随时在这里发布参数化查询,我们会再次提供帮助: - )