Select Query返回空记录

本文关键字:记录 返回 Query Select | 更新日期: 2023-09-27 18:10:05

大家好,基本上我有一个c#应用程序,允许用户输入关于库存汽车的查询(字段是汽车制造商,型号,年龄,公升大小)。

查询的内容可以根据用户正在查找的字段而变化(例如,一个人可能查找所有福特汽车,或者另一个查询可能是所有6年历史的福特汽车)。

在输入查询后,程序应该将请求的数据返回给表单上的dataGridView。我的问题是,查询执行,但只返回一个空白的记录,虽然它找不到一个合适的记录(我只输入查询的,肯定会返回一个记录),这让我相信我的编码是错误的(特别是参数),但我不知道我在哪里出错,有人可以伸出援助之手吗?

            string ConnStr = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = H:''School Work''Computing A Level''Stock checker''Program''Morgan's Motors Database.mdb;";
            OleDbConnection conn_database = new OleDbConnection();
            conn_database.ConnectionString = ConnStr;
            OleDbCommand comm_database = new OleDbCommand();
            comm_database.CommandText = "SELECT * FROM [Car Info] WHERE ? = ?";
            comm_database.Connection = conn_database;
            conn_database.Open();
            OleDbDataAdapter adap_database = new OleDbDataAdapter(comm_database);
            DataTable data_database = new DataTable();
            for (int i = 0; i < ColumnName.Count; i++)
            {
                comm_database.Parameters.AddWithValue("?", ColumnName[i].ToString());
                comm_database.Parameters.AddWithValue("?", EnteredFields[i].ToString());
                adap_database.Fill(data_database);
            }
            BindingSource bind_database = new BindingSource();
            bind_database.DataSource = data_database;
            dataGridView1.DataSource = bind_database;

Select Query返回空记录

有两件事对我来说很奇怪:

comm_database.CommandText = "SELECT * FROM [Car Info] WHERE ? = ?";
  1. 字段名应该是真实的,而不是"?"(但"?"是正确的值)。
  2. 在您的查询中,您只指定一对file=value,但在下面循环并添加参数到您的dbcommand。因为它们与sql文本中的任何内容无关,所以它不会像预期的那样工作。

comm_database。CommandText = "SELECT * FROM [Car Info] WHERE ";

for (int i = 0; i < ColumnName.Count; i++)
{
    comm_database.CommandText += (i>0 ? " AND " : "") ColumnName[i].ToString() + " = ?";
    comm_database.Parameters.AddWithValue("?", EnteredFields[i].ToString());
}

我猜你的问题是你的select语句。您必须在命令文本中显式地命名参数。你正在使用的语句:

"SELECT * FROM [Car Info] WHERE ? = ?"
因此

应该更改为如下内容(取决于您的参数)

"SELECT * FROM [Car Info] WHERE BRAND = ? AND ..."

参见:OleDbCommand参数顺序和优先级

列名不能作为绑定参数。…

comm_database.Parameters.AddWithValue("?", ColumnName[i].ToString());

…被解释为一个值,而不是列名。

  • 如果该值与第二个参数的值不同,则不会返回任何行(因为WHERE ? = ?的计算结果为false,无论数据库中实际是什么)。
  • 如果它们相等,将返回所有行(同样,不管数据库中实际是什么)。

这是一种适合使用动态SQL的情况:一旦知道了所有搜索条件(您仍然应该使用参数作为搜索值),就在运行时构造SQL文本,如下所示:

"SELECT * FROM [Car Info] WHERE COLUMN1 = ? AND COLUMN2 = ?" (etc...)

确保COLUMN1, COLUMN2等在插入SQL文本之前被列入白名单,或者以其他方式"净化"。

即使面对这种不断变化的搜索条件,也有一些方法可以使用静态SQL,但这可能会在性能方面产生意想不到的后果。