2014-01-21 63 views
0

這是我的代碼,我試圖實現一個搜索功能,即時通訊我的應用程序:與SQL數據適配器搜索功能問題

private void button1_Click(object sender, EventArgs e) 
{ 
    SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=c:\users\dido\documents\visual studio 2012\Projects\CourseProjectCars\CourseProjectCars\DataCars.mdf;Integrated Security=True;Connect Timeout=30"); 

    SqlDataAdapter SDA = new SqlDataAdapter("SELECT * FROM SuperCars where Car like " + textBox1.Text, conn); 
    DataTable dt = new DataTable(); 
    SDA.Fill(dt); 
    dataGridView1.DataSource = dt;      
} 

,當我想在我的數據庫進行搜索,例如「布加迪「,它說」無效的列名'布加迪'。「也許這是我的一個簡單的錯誤,但我找不到它..

回答

3

問題:您不通過忽略單引號正確提供搜索參數。

解決方案:您需要在single quotes範圍內包含字符串類型。

建議:您的SELECT查詢是否對SQL注入攻擊開放。您需要使用參數化的SQL查詢來避免這種情況。

參數化查詢有助於隱式傳遞具有有效類型的參數。沒有使用參數化查詢

SqlDataAdapter SDA = new SqlDataAdapter("SELECT * FROM SuperCars where Car like '" + textBox1.Text+"'", conn); 

解決方案2:

例如在使用參數化查詢

解決方案1中傳遞參數,你不需要單引號內的字符串類型使用參數化查詢

SqlCommand sqlcmd = new SqlCommand("SELECT * FROM SuperCars where Car like @Car); 
sqlcmd.Parameters.AddWithValue("@Car","%"+textBox1.Text+"%"); 
+0

再次查看您的參數化查詢解決方案。這是完全錯誤的。缺少雙引號,錯誤使用類似部分。 –

+1

@SonerGönül:感謝您的寶貴意見。現在添加了用於搜索的代碼。 –

2

使用parameterized queries.而不是字符串連接。在這種連接中,您可以輕鬆忘記一些引號等。

它很容易閱讀和防止SQL Injection攻擊。

SqlCommand cmd = new SqlCommand(@"SELECT * FROM SuperCars where Car like '%@car%'"); 
cmd.Parameters.AddWithValue("@car", textBox1.Text); 
SqlDataAdapter SDA = new SqlDataAdapter(cmd.CommandText, conn); 

還可以使用using Statement處置您的SqlConnection等;

using(SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=c:\users\dido\documents\visual studio 2012\Projects\CourseProjectCars\CourseProjectCars\DataCars.mdf;Integrated Security=True;Connect Timeout=30")) 
{ 
    // 
} 
+0

這一切看起來不錯,但現在這個部分有一個錯誤:SqlDataAdapter SDA = new SqlDataAdapter(cmd,conn);它有一些無效的論點。 – Cathy

+0

@Cathy現在看看。 'SqlDataAdapter'沒有一個構造函數將'SqlCommand'和'SqlConnection'作爲參數。我將'cmd'更改爲'cmd.Text'以獲得正確的構造函數。 –

+0

現在cmd.Text中的文本部分加下劃線,錯誤是沒有文本的定義.... – Cathy