2013-04-01 17 views
0

我想搜索名稱的empid,並在我的文本框中輸入字符。使用通配符。我寫的聲明使用文本框值和通配符搜索

da = new SqlDataAdapter(
"Select empID from emp where FirstName like ' "+textbox1.text+" ' % " 
    , connstring); 
da.Fill(ds); 

是這種說法是否正確?

+2

[媽媽的漏洞(http://xkcd.com/327/) –

+0

懇求選擇這個問題的答案。謝謝! –

回答

0

該陳述有許多不妥之處。

簡單的一點是,您的單引號和文本框值之間有空格,百分號不在需要的位置。另外,textbox1.text拼寫錯誤。它應該更接近:

da = new SqlDataAdapter(
"Select empID from emp where FirstName like '"+textbox1.Text+"%' ", connstring); 

但這只是第一個問題。 更大的問題是,這是SQL注入的主要候選者。How do parameterized queries help against SQL injection?

+0

我可以使用da和ds參數嗎? – Seema

+0

是的。使用參數與您是使用'sqldataadapter'還是'dataset'無關。你的問題的幾個答案提供了例子。 – NotMe

+0

:非常感謝:) – Seema

1

你是開放的sql-injection,用sql-parameters代替:

string sql = "SELECT empID " + 
       "FROM emp " + 
       "WHERE FirstName like @FirstName"; 
using(var con = new SqlConnection(connstring)) 
using (SqlCommand command = new SqlCommand(sql, con)) 
{ 
    command.Parameters.AddWithValue("@FirstName", textbox1.text + "%"); 
    using(var da = new SqlDataAdapter(command)) 
    { 
     da.Fill(ds); 
    } 
} 

的跡象%需參數值的一部分,使用綁定,當你不需要單引號在所有參數。

+0

我實際上試圖返回所有名稱以文本框輸入值開頭的僱員的empId。如果我使用參數和存儲過程,我將如何存儲從數據庫返回給我的多行? 這就是我使用數據集的原因。有沒有另一種方式使用參數?我認爲我們只能返回一行的值。 – Seema

+0

@Seema:我無法關注。我不使用存儲過程,我使用參數,我爲'FirstName'的給定部分返回多個empID,我使用'DataSet',所以它是否工作,或不? –

+0

是的,我想通了,Thanx很多:) – Seema

1

您輸入的語句將允許在通配符搜索之前的名字前面和後面的空格。如果你要搜索一個名字的任何部分,你需要改變你的SQL是這樣的:

SELECT empID FROM emp WHERE FirstName LIKE '@FirstName%' 

而且,它是更安全使用parameretized查詢,這樣對剛剛串聯你的論點:

StringBuilder sb = new StringBuilder(); 
sb.Append("SELECT empID FROM emp WHERE FirstName LIKE '@FirstName%'"); 

SqlConnection conn = new SqlConnection(connStr); 
SqlCommand command = new SqlCommand(sb.ToString()); 
command.CommandType = CommandType.Text; 
command.Parameters.AddWithValue("FirstName", textbox1.Text); 
DataTable dt = new DataTable(); 
SqlDataAdapter da = new SqlDataAdapter(command); 
da.Fill(dt); 

如果你想使用存儲過程,你需要設置你的SqlCommand對象,像這樣:

SqlCommand command = new SqlCommand("Procedure", conn); 
command.CommandType = Command.StoredProcedure; 
+0

我實際上試圖返回所有那些名稱以textbox輸入值開頭的僱員的empId。如果我使用參數和存儲過程,我將如何存儲從數據庫返回給我的多行?這就是我使用數據集的原因。有沒有另一種方式使用參數?我認爲我們只能返回一行的值。 – Seema

+0

我已經更新了我的答案以填充DataTable。它比scartag的答案多了幾行,但類似。我明確地創建了每個對象,而不是使用scartag使用的簡寫方法。 –

+0

這意味着我可以一起使用da和ds參數,如果我有存儲過程? – Seema