0

嘿,基本上我有一个 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;
4

3 回答 3

1

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

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

comm_database.CommandText = "SELECT * FROM [汽车信息] 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());

}
于 2013-04-20T18:19:12.553 回答
0

列名不能绑定参数。这...

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

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

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

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

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

确保COLUMN1COLUMN2在被插入 SQL 文本之前被列入白名单,或者以其他方式“清理”。

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

于 2013-04-21T20:45:16.247 回答
0

我想你的问题是你的选择语句。您必须在命令文本中明确命名参数。您正在使用的语句:

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

因此应该改为这样的(取决于你的参数)

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

另请参阅:OleDbCommand 参数顺序和优先级

于 2013-04-20T18:17:47.673 回答