2010-06-28 79 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