C# Select查询返回空记录
嘿,基本上,我有一个C应用程序,允许用户在库存字段中输入关于汽车的查询,这些字段是汽车制造商、型号、年龄、升大小 查询的内容可能因用户正在查找的字段而异,例如,一个人可能查找所有福特汽车,或者另一个查询可能是所有6年前的福特汽车 输入查询后,程序应将请求的数据返回到表单上的dataGridView。我的问题是,查询执行时只返回一条空白记录,就好像它找不到合适的记录一样。我只输入了一个查询,它肯定会返回一条记录。这让我相信我的编码有问题,特别是参数,但我不知道哪里出了问题,有人能帮我一下吗C# Select查询返回空记录,c#,sql,ms-access,oledb,C#,Sql,Ms Access,Oledb,嘿,基本上,我有一个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;
我想你的问题在于你的选择陈述。必须在commandtext中显式命名参数。您正在使用的语句:
"SELECT * FROM [Car Info] WHERE ? = ?"
因此,应根据您的参数更改为类似的内容
"SELECT * FROM [Car Info] WHERE BRAND = ? AND ..."
另请参见:有两件事对我来说很奇怪:
comm_database.CommandText = "SELECT * FROM [Car Info] WHERE ? = ?";
字段名应该是真实的,而不是?但是对于该值来说是正确的。
在查询中,只指定一个耦合file=value,但在下面循环并向dbcommand添加参数。因为它们与sql文本中的任何内容都不相关,所以它无法按预期工作。
comm_database.CommandText=从[Car Info]中选择*,其中
for (int i = 0; i < ColumnName.Count; i++)
{
comm_database.CommandText += (i>0 ? " AND " : "") ColumnName[i].ToString() + " = ?";
comm_database.Parameters.AddWithValue("?", EnteredFields[i].ToString());
}
列名不能是绑定参数。这个
comm_database.Parameters.AddWithValue("?", ColumnName[i].ToString());
…被解释为值,而不是列名
如果该值与第二个参数的值不同,则不会返回任何行,因为其中?=?无论数据库中实际存在什么,计算结果都为false。
如果它们相等,则将再次返回所有行,而不考虑数据库中的实际内容。
这是一种适合使用动态SQL的情况:在运行时构造SQL文本,一旦知道所有搜索条件,您仍应使用参数作为搜索值,如下所示:
"SELECT * FROM [Car Info] WHERE COLUMN1 = ? AND COLUMN2 = ?" (etc...)
在插入SQL文本之前,请确保列1、列2等已白名单,或已进行了消毒
即使在面对这种不断变化的搜索条件时,也有使用静态SQL的方法,但这种方法可以做到。感谢您的回复。我在使用AND时遇到的问题是,有时用户可能只查询一列,我如何让代码知道何时不添加AND?请看以下内容:很好,但是,将ColumnName.Count>0更改为i>0,并使用StringBuilder比在未知长度的循环中连接字符串要好。第一个comm_数据库行在括号中的部分之后给了我一个错误,这是否意味着也要用括号括起来?没人能解释吗?我对这个问题束手无策好吧,我得到了括号内的错误,但我仍然收到了空白记录编辑:从单步执行代码来看,问题似乎是。AddWithValue没有取代?标志