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;
有两件事对我来说很奇怪:
comm_database.CommandText = "SELECT * FROM [Car Info] WHERE ? = ?";
- 字段名应该是真实的,而不是"?"(但"?"是正确的值)。
- 在您的查询中,您只指定一对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,但这可能会在性能方面产生意想不到的后果。