这是我的代码,我正在尝试在我的应用程序中实现搜索功能:
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'。”也许这是我的一个简单的错误,但我找不到它..
答案 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"))
{
//
}