C# 实现搜索按钮时列名无效

C# 实现搜索按钮时列名无效,c#,sql-server-2008,C#,Sql Server 2008,我正在使用C和SQLServer2008,当我试图创建一个用于搜索记录的命令时,我得到了一个异常,该异常表示列名无效 这是我的代码: void cari() { koneksi.Open(); DataTable dt = new DataTable(); SqlDataAdapter SDA = new SqlDataAdapter("SELECT * FROM jadwalkuliah where Sub

我正在使用C和SQLServer2008,当我试图创建一个用于搜索记录的命令时,我得到了一个异常,该异常表示列名无效

这是我的代码:

void cari()
        {
            koneksi.Open();
            DataTable dt = new DataTable();
            SqlDataAdapter SDA = new SqlDataAdapter("SELECT * FROM jadwalkuliah where Subject = "+ textBox1.Text, koneksi);
            SDA.Fill(dt);
            koneksi.Close();

            dataGridView1.DataSource = dt;
        }`

搜索命令应该是搜索引擎,有人能帮我吗

您没有引用主题的值:

SqlDataAdapter SDA = new SqlDataAdapter("SELECT * FROM jadwalkuliah where Subject = '"+ textBox1.Text + "'", 
科内基

或用于包含搜索: SqlDataAdapter SDA=新SqlDataAdapter从jadwalkuliah中选择*,其中Subject='%+textBox1.Text+%',koneksi

您不应该以这种方式构建查询。它很容易受到影响。

直接的问题是WHERE子句看起来像:

where Subject = Foo
SELECT * FROM jadwalkuliah where Subject LIKE @Subject
它试图将Subject列的值与Foo列的值进行比较

解决这个问题的方法是用引号括起来。更好的解决方案是使用参数化SQL:

string sql = "SELECT * FROM jadwalkuliah where Subject = @Subject";
using (SqlConnection connection = new SqlConnection(...))
using (SqlDataAdapter adapter = new SqlDataAdapter(sql, connection))
{
    connection.Open();
    adapter.SelectCommand.Parameters.Add("@Subject", SqlDbType.VarChar)
                                    .Value = textBox1.Text;
    adapter.Fill(dt);
}
另外,请注意,您不应该从GUI线程执行数据库访问。目前还不清楚这是一个web应用,在这种情况下它是正常的,还是WPF/WinForms,在这种情况下它不是

请注意,这仍将尝试进行精确匹配。对于通配符匹配,您需要将其更改为:

where Subject = Foo
SELECT * FROM jadwalkuliah where Subject LIKE @Subject

。。。并使用%+textBox1.Text+%这样的值添加参数。然后,您需要考虑在该值内转义,但这是另一个问题…

非常感谢您的回答,这对我非常有用。为什么直接从web应用程序查询DB比从winforms应用程序查询DB更合适?我认为这很大程度上取决于应用程序的规模和体系结构,而不是演示的类型。@flem:这与直接部分无关,而是与线程有关。在富客户端场景中,您将阻塞UI线程,从而冻结应用程序。在一个web应用程序中,你只是阻止了响应的发送-这很好,因为在你得到数据之前你真的不能返回响应…很好的答案,你真的帮了我很多,谢谢!顺便说一句,我只需要使用关键字'like'@RadityaKurnianto使它更完美:不,你不需要把它改成like。您需要将其更改为使用参数化SQL。不要走这里的捷径-正确地完成这项工作。@JonSkeet您所说的参数化SQL是什么意思?你能给我解释一下吗,因为我是SQL的新手。@RadityaKurnianto:我的答案里到底是什么。。。您可以在SQL本身中表示一个参数,然后分别为该参数指定一个值。它可以防止SQL注入攻击,避免不必要的和潜在的错误转换,并将您的数据与代码SQL分离。@JonSkeet现在我明白您的意思了,那么使用SqlConnection connection=new SqlConnection如何处理包含blank的代码。。。空白处我应该填写什么?