实现搜索按钮时列名无效

本文关键字:无效 搜索 按钮 实现 | 更新日期: 2024-09-27 05:15:48

我正在使用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;
        }`

搜索命令应该像搜索引擎一样工作,有人能帮我吗?

实现搜索按钮时列名无效

好吧,立即的问题是您的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

并添加类似CCD_ 1的参数。(然后您需要考虑在该值内进行转义,但这是另一回事…)

您没有引用主题的值:

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

koneksi);

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

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