Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Select查询返回空记录_C#_Sql_Ms Access_Oledb - Fatal编程技术网

C# Select查询返回空记录

C# Select查询返回空记录,c#,sql,ms-access,oledb,C#,Sql,Ms Access,Oledb,嘿,基本上,我有一个C应用程序,允许用户在库存字段中输入关于汽车的查询,这些字段是汽车制造商、型号、年龄、升大小 查询的内容可能因用户正在查找的字段而异,例如,一个人可能查找所有福特汽车,或者另一个查询可能是所有6年前的福特汽车 输入查询后,程序应将请求的数据返回到表单上的dataGridView。我的问题是,查询执行时只返回一条空白记录,就好像它找不到合适的记录一样。我只输入了一个查询,它肯定会返回一条记录。这让我相信我的编码有问题,特别是参数,但我不知道哪里出了问题,有人能帮我一下吗

嘿,基本上,我有一个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没有取代?标志