选择查询返回空记录

时间:2013-04-20 18:08:03

标签: 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;

3 个答案:

答案 0 :(得分:1)

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

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

另见:OleDbCommand parameters order and priority

答案 2 :(得分:0)

列名不能是绑定参数。所述...

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

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

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

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

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

在插入SQL文本之前,请确保COLUMN1COLUMN2等已列入白名单,或以其他方式进行“清理”。

即使面对不断变化的搜索条件,也有一些方法可以使用静态SQL,但这可以有unintended consequences performance-wise