C# SQL数据适配器搜索功能出现问题

C# SQL数据适配器搜索功能出现问题,c#,database,winforms,search,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\Cour

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

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.”“也许这是我的一个简单错误,但我找不到它。

问题:忽略单引号,没有正确提供搜索参数

解决方案:您需要将字符串类型括在
单引号中

建议:您的
SELECT
查询容易受到SQL注入攻击。您需要使用参数化SQL查询来避免这种情况

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

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

SqlDataAdapter SDA = new SqlDataAdapter("SELECT * FROM SuperCars where Car like '" + textBox1.Text+"'", conn);
SqlCommand sqlcmd = new SqlCommand("SELECT * FROM SuperCars where Car like @Car);
sqlcmd.Parameters.AddWithValue("@Car","%"+textBox1.Text+"%");
解决方案1:不使用参数化查询

SqlDataAdapter SDA = new SqlDataAdapter("SELECT * FROM SuperCars where Car like '" + textBox1.Text+"'", conn);
SqlCommand sqlcmd = new SqlCommand("SELECT * FROM SuperCars where Car like @Car);
sqlcmd.Parameters.AddWithValue("@Car","%"+textBox1.Text+"%");
解决方案2:使用参数化查询

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

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

解决方案:您需要将字符串类型括在
单引号中

建议:您的
SELECT
查询容易受到SQL注入攻击。您需要使用参数化SQL查询来避免这种情况

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

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

SqlDataAdapter SDA = new SqlDataAdapter("SELECT * FROM SuperCars where Car like '" + textBox1.Text+"'", conn);
SqlCommand sqlcmd = new SqlCommand("SELECT * FROM SuperCars where Car like @Car);
sqlcmd.Parameters.AddWithValue("@Car","%"+textBox1.Text+"%");
解决方案1:不使用参数化查询

SqlDataAdapter SDA = new SqlDataAdapter("SELECT * FROM SuperCars where Car like '" + textBox1.Text+"'", conn);
SqlCommand sqlcmd = new SqlCommand("SELECT * FROM SuperCars where Car like @Car);
sqlcmd.Parameters.AddWithValue("@Car","%"+textBox1.Text+"%");
解决方案2:使用参数化查询

SqlDataAdapter SDA = new SqlDataAdapter("SELECT * FROM SuperCars where Car like '" + textBox1.Text+"'", conn);
SqlCommand sqlcmd = new SqlCommand("SELECT * FROM SuperCars where Car like @Car);
sqlcmd.Parameters.AddWithValue("@Car","%"+textBox1.Text+"%");
使用而不是字符串连接。在这种连接中,您很容易忘记一些引号等

它很容易阅读和防止附件

还可用于处置
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"))
{
  //
}
使用而不是字符串连接。在这种连接中,您很容易忘记一些引号等

它很容易阅读和防止附件

还可用于处置
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"))
{
  //
}

再次查看您的参数化查询解决方案。这完全是错误的。缺少双引号,相似部分使用错误。@SonerGönül:谢谢你宝贵的观点。现在还添加了搜索代码。再次查看参数化查询解决方案。这完全是错误的。缺少双引号,相似部分使用错误。@SonerGönül:谢谢你宝贵的观点。现在还添加了搜索代码。这一切看起来不错,但现在这部分有一个错误:SqlDataAdapter SDA=newsqldataadapter(cmd,conn);它有一些无效的参数。@Cathy现在看看
SqlDataAdapter
没有构造函数将
SqlCommand
SqlConnection
作为参数。对于正确的构造函数,我将
cmd
更改为
cmd.Text
。现在cmd.Text中的文本部分加了下划线,错误是文本没有定义…@Cathy我很抱歉。它是
CommandText
而不是
Text
。再看一看。@Cathy您是否在数据库的服务器资源管理器中尝试了最后的
SqlCommand
?当您在数据库上尝试它时,它会得到行吗?这看起来不错,但现在这部分有一个错误:SqlDataAdapter SDA=newsqldataadapter(cmd,conn);它有一些无效的参数。@Cathy现在看看
SqlDataAdapter
没有构造函数将
SqlCommand
SqlConnection
作为参数。对于正确的构造函数,我将
cmd
更改为
cmd.Text
。现在cmd.Text中的文本部分加了下划线,错误是文本没有定义…@Cathy我很抱歉。它是
CommandText
而不是
Text
。再看一看。@Cathy您是否在数据库的服务器资源管理器中尝试了最后的
SqlCommand
?当您在数据库上尝试它时,它会得到行吗?