2012-08-02 104 views
0

考慮下面的代碼:SqlCommand的參數不能正常工作

SqlConnection conn = new SqlConnection(@"connection string"); 

SqlCommand ourCommand = new SqlCommand(String.Format(
    @"SELECT Field1,Field2,Field3 FROM Tbl WHERE Field1 LIKE '@FL1'"), conn); 
ourCommand.CommandTimeout = 6000; 

ourCommand.Parameters.AddWithValue("@FL1", TextBox1.Text); 

SqlDataAdapter adapter = new SqlDataAdapter(ourCommand); 
DataTable dt = new DataTable(); 

conn.Open(); 
adapter.Fill(dt); 
GridView1.DataSource = dt; 

GridView1.DataBind(); 

的問題是,datatable是空 - 這意味着產生要麼沒有執行或不正確的查詢命令。我錯過了什麼?連接和查詢有效。不帶參數的命令也起作用。數據庫引擎是SQL Server 2008 R2

+4

嘗試「@ FL1」去除周圍的參數單引號 - > @ FL1 – 2012-08-02 14:43:47

+0

不要運行相同的查詢時,你得到的結果(手動從SQL Management Studio中添加參數的值)? – 2012-08-02 14:44:05

+0

你從TextBox1.Text傳遞了什麼數據?是否像「%sometext%」?即如果你用相同的參數自己執行查詢(例如在SSMS中) - 是否返回結果? – 2012-08-02 14:44:20

回答

6

您已將參數名稱放在引號中,因此它被視爲的值,而不是作爲參數。試試這個:

"SELECT Field1,Field2,Field3 FROM Tbl WHERE Field1 LIKE @FL1" 

(其實我期待你的現有代碼拋出一個異常,因爲你比都在SQL提供更多參數......)

正如在評論中指出,您也不需要string.Format

+0

而'string.Format'沒有一個只有單個參數的超載... – Oded 2012-08-02 14:46:05

+0

感謝所有,這是正確的。還有一個問題:參數的這種使用會防止SQL注入嗎? – seeker 2012-08-02 14:46:30

+0

@Oded:是的,因爲params數組。 'String.Format(「foo」)'相當於'String.Format(「Foo」,新對象[])' – 2012-08-02 14:47:15

5

您的查詢不是格式良好的查詢。

相反的:

String.Format(
    @"SELECT Field1,Field2,Field3 FROM Tbl WHERE Field1 LIKE '@FL1'") 

用途:

"SELECT Field1,Field2,Field3 FROM Tbl WHERE Field1 LIKE @FL1" 

注意,沒有必要爲string.Format,也不''圍住參數名稱,因爲沒有任何字符串中逃脫正如Jon所評論的那樣,不需要它是逐字字符串文字(使用@)。

+1

您可以刪除@也:) – 2012-08-02 14:48:09

+0

@JonSkeet - 足夠真實:) – Oded 2012-08-02 14:50:49

+0

如果參數等於「'」(撇號),那麼將拋出異常,這也意味着可以執行sql注入。如何保護? – seeker 2012-08-02 14:59:26

3

嘗試轉產這個如果您使用的參數(去掉勾選標記sorrounding @ FL1)

SqlCommand ourCommand=new SqlCommand(
      "SELECT Field1,Field2,Field3 FROM Tbl WHERE Field1 LIKE @FL1",conn); 
+1

刪除'string.Format',你就在那裏。 – Oded 2012-08-02 14:46:22

+0

@付費哈!試圖看看是否有人注意;)甚至沒有注意到我自己:D固定 – Jason 2012-08-02 14:47:31

1

,你並不需要使用單引號。 看一下課程here

1

嗯,首先,你不需要string.format或@的(你沒有轉義的字符,你的字符串在一行,而你沒有使用參數化的字符串,所以沒有理由任何一個)然後,你不需要@ FL1附近的引號。 SqlCommand解析整個字符串爲@,而不是用引號分隔的子字符串。我相信最終代碼應該如下所示:

SqlCommand ourCommand=new SqlCommand("SELECT Field1,Field2,Field3 FROM Tbl WHERE Field1 LIKE @FL1",conn); 

其他所有我認爲您可以保持不變的東西。

0

您需要強制使用級聯百分之% - >

SELECT Field1,Field2,Field3 FROM Tbl WHERE Field1 LIKE **'%'** + @FL1 + **'%'**