嘿所有基本上我都有一个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;
答案 0 :(得分:1)
对我来说有两件事情很奇怪:
comm_database.CommandText = "SELECT * FROM [Car Info] WHERE ? = ?";
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());
}
答案 1 :(得分:0)
我猜你的问题是你的选择陈述。您必须在命令文本中明确命名参数。您正在使用的声明:
"SELECT * FROM [Car Info] WHERE ? = ?"
因此,应该改为这样的(取决于你的参数)
"SELECT * FROM [Car Info] WHERE BRAND = ? AND ..."
答案 2 :(得分:0)
列名不能是绑定参数。所述...
comm_database.Parameters.AddWithValue("?", ColumnName[i].ToString());
...被解释为值,而不是列名。
WHERE ? = ?
的计算结果为false,无论数据库中的实际内容是什么)。这是动态SQL合适的情况之一:一旦知道所有搜索条件(您仍然应该使用搜索值的参数),在运行时构造SQL文本,如下所示:
"SELECT * FROM [Car Info] WHERE COLUMN1 = ? AND COLUMN2 = ?" (etc...)
在插入SQL文本之前,请确保COLUMN1
,COLUMN2
等已列入白名单,或以其他方式进行“清理”。
即使面对不断变化的搜索条件,也有一些方法可以使用静态SQL,但这可以有unintended consequences performance-wise。