SQL数据适配器搜索功能问题

时间:2014-01-21 12:38:29

标签: c# database winforms search

这是我的代码,我正在尝试在我的应用程序中实现搜索功能:

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;                    
}

当我尝试在我的数据库中搜索时,例如“Bugatti”,它说“无效的列名'Bugatti'。”也许这是我的一个简单的错误,但我找不到它..

2 个答案:

答案 0 :(得分:3)

问题:您没有通过忽略单引号来正确提供搜索参数。

解决方案:您需要将字符串类型括在single quotes中。

建议:您的SELECT查询对SQL注入攻击是开放的。您需要使用参数化SQL查询来避免这种情况。

参数化查询有助于隐式传递具有有效类型的参数。

例如,在使用参数化查询传递参数时,您不需要将字符串类型括在单引号中

解决方案1:,不使用参数化查询

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

解决方案2:使用参数化查询

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

答案 1 :(得分:2)

使用 parameterized queries. 代替字符串连接。在这种连接中,你可以轻易忘记一些引号等。

易于阅读和阻止SQL Injection attakcs。

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"))
{
  //
}