2

我正在使用 C# 和 SQL Sever 2008,当我尝试创建一个用于搜索记录的命令时,我遇到了“列名无效”的异常

这是我的代码:

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

搜索命令应该作为搜索引擎工作,任何人都可以帮助我吗?

4

2 回答 2

5

那么直接的问题是您的 WHERE 子句将类似于:

where Subject = Foo

它试图将 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 线程执行数据库访问。目前尚不清楚这是一个网络应用程序(在这种情况下可以)还是 WPF/WinForms(在这种情况下不是)。

请注意,这仍然会尝试进行完全匹配。对于“通配符”匹配,您需要将其更改为:

SELECT * FROM jadwalkuliah where Subject LIKE @Subject

...并添加类似的参数"%" + textBox1.Text + "%"。(然后您需要考虑在该值内转义,但这是另一回事......)

于 2012-08-02T08:09:06.743 回答
4

您没有引用主题的价值:

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

科内克西);

或者对于包含搜索: SqlDataAdapter SDA = new SqlDataAdapter("SELECT * FROM jadwalkuliah where Subject = '%"+ textBox1.Text + "%'", koneksi);

您不应该以这种方式构建查询。它容易受到SQL 注入攻击

于 2012-08-02T08:07:53.267 回答