2010-06-28 64 views
2

我有一个有点复杂的查询,基本上我在大多数字段中搜索数据库中的字符串或字符串。如果它是多个字符串,则数据库字段必须匹配字符串的所有部分。为什么我的参数化查询不起作用?

这是该查询是建立在基本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

你试过只是打印出结果查询,看看你的代码实际上是提交到数据库? – 2010-06-28 18:58:51

+0

我可以使用@param [0-x]输出查询,但SqlCommand并没有据我所知,允许我打印出结果查询。 – Malfist 2010-06-28 19:00:20

回答

2

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

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

从而使TSQL是:

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

或者更简单;将'%'置于调用代码中的值;那么你的代码变成:

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

和TSQL变为:

... LIKE @param2 ... 
+0

@ param2被替换为一个特定的值,所以它应该看起来像'x LIKE'%blah%'' – Malfist 2010-06-28 19:08:57

+0

@Malfist - no,这不是参数化的工作方式。在一个字符串中间,即'%@ param2%',它不是一个参数,而是一些字符数据,它们恰好是'@','p','a',a 'r','a','m'和'2'。它*虽然是一个参数,但是:''%'+ @ param2 +'%'' – 2010-06-28 19:11:07

1

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

将其复制并粘贴到SQL Server Mgmt Studio中并运行它 - 我相信你会发现是什么原因导致了问题......如果没有,你可以在这里发布参数化查询,我们会帮助你再次:-)

+0

我没有SQL事件探查器,我只有SQL Server 2008的快速版本 – Malfist 2010-06-28 19:09:47

+0

@malfist:好的,下次你应该在你的原始问题中提及这样一个重要的事实! – 2010-06-28 19:14:13

相关问题