2014-05-19 17 views
-1

我遇到了一個嚴重問題,導致在我的C#應用​​程序中的一個searchBar TextBox中進行驗證。字符串'ORDER BY CHECKTIME DESC'後未使用引號'

每次我運行程序並輸入文本,數字或甚至某些特殊字符時,我都沒有問題......但是,第二個使用引號(')時出現錯誤,如標題。

下面是我用在執行特定進程的代碼,請能有人來救我:

SqlDataAdapter sda1 = new SqlDataAdapter(
    "SET ROWCOUNT 25 
    select ui.USERID [User ID], 
      ui.BADGENUMBER [Employee No.], 
      ui.NAME [Name], 
      ci.CHECKTIME [Clock Time], 
      ci.CHECKTYPE [I/O], 
      ci.SENSORID [Sensor ID] 
    FROM 
      USERINFO ui, 
      CHECKINOUT ci 
    WHERE 
      ui.USERID = ci.USERID and 
      ci.CHECKTYPE in ('I','O') and 
      ui.NAME like '%" + searchBar.Text + "%' 
    ORDER BY 
      CHECKTIME DESC ", con); 

提前感謝的人...

+3

千萬不要連接用戶輸入來創建SQL。請搜索「Bobby Tables」。您應該使用*參數*,即'... ui.NAME like'%'+ @name +'%'ORDER BY ...',其中'@ name'是一個參數, searchBar.Text'。如果你的大部分數據訪問看起來像這樣,那麼你現在需要停止**並重新訪問整個數據訪問層:它被危險地破壞了。 –

+0

@mrBrown如果你不這樣使用,因爲可能有SQL注入的機會。 –

+1

@DhavalPatel我會說這是有把握的; p –

回答

1

您必須在SQL中跳轉' - ''。下面是一個如何使用參數執行此操作的示例。

string SQL = "SET ROWCOUNT 25 select ui.USERID [User ID], ui.BADGENUMBER [Employee No.], ui.NAME [Name], ci.CHECKTIME [Clock Time], ci.CHECKTYPE [I/O], ci.SENSORID [Sensor ID] FROM USERINFO ui, CHECKINOUT ci WHERE ui.USERID = ci.USERID and ci.CHECKTYPE in ('I','O') and ui.NAME like @SearchText ORDER BY CHECKTIME DESC "; 
SqlCommand cmd = new SqlCommand(SQL, con); 
cmd.Parameters.Add("@SearchText", SqlDbType.VarChar).Value = "%" + searchBar.Text + "%"; 

SqlDataAdapter sda1 = new SqlDataAdapter(cmd); 

這將同時參數化您的查詢和轉義您在搜索文本中的任何單引號。

+0

上帝保佑你,絕對的救星! – MrBrownDXB

+0

不客氣。快樂編碼:) – Tim

+0

我現在正在學習參數,因爲我需要在整個表單中使用乾淨的代碼來實現這種搜索數據庫的方法。 – MrBrownDXB

0

你不能「不幸的是,當您使用運行查詢,SQL會將字符串內的單引號解釋爲表示該字符串的結尾。