OLEDB参数化查询

时间:2012-08-21 03:41:26

标签: c# .net winforms ms-access oledb

public void LoadDB()
{
    string FileName = @"c:\asdf.accdb";
    string query = "SELECT ID, Field1 FROM Table1 WHERE ID=? AND Field1=?";
    string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FileName;

    OleDbConnection odc = new OleDbConnection(strConn);
    dAdapter = new OleDbDataAdapter();
    OleDbCommand cmd = new OleDbCommand(query,odc);

    cmd.Parameters.Add("?", OleDbType.Integer, 5).Value = 1234;
    cmd.Parameters.Add("?", OleDbType.BSTR, 5).Value ="asdf";

    dAdapter.SelectCommand = cmd;

    ds = new DataSet();
    dAdapter.Fill(ds);
    dataGridView1.DataSource = ds.Tables[0];
}

我正在尝试使用参数化查询将访问文件绑定到datagridview。它找到列名称,但内容为空。

如何解决此问题?

3 个答案:

答案 0 :(得分:4)

以下是参数化查询如何与CSharp,OleDB一起使用的示例。

try
{
    connw.Open();
    OleDbCommand command;
    command = new OleDbCommand(
        "Update Deliveries " +
        "SET Deliveries.EmployeeID = ?, Deliveries.FIN = ?, Deliveries.TodaysOrders = ? , connw);
    command.Parameters.Add(new OleDbParameter("@EMPID", Convert.ToDecimal(empsplitIt[1])));
    command.Parameters.Add(new OleDbParameter("@FIN", truckSplit[1].ToString()));
    command.Parameters.Add(new OleDbParameter("@TodaysOrder", "R"));
    catchReturnedRows = command.ExecuteNonQuery();//Commit   
    connw.Close();

}
catch (OleDbException exception)
{
    MessageBox.Show(exception.Message, "OleDb Exception");
}

这适用于任何sql语句,你必须分配问号"?"对于每个参数,然后在下面,您必须创建参数并按照您布置问号的顺序添加它们,以便将正确的数据输入到正确的字段中。

答案 1 :(得分:2)

在我的测试程序中,ds.Tables [0] .Rows.Count数据表实际上返回了1行(因为我的测试数据库中有一行与查询本身匹配)。如果你在这一行上休息一下,你应该能够看到数据是否首先进入数据表。试试这个:

dataGridView1.DataSource = ds.Tables[0];

dataGridView1的前端绑定是什么样的?在Access中运行查询也可以了解情况。

答案 2 :(得分:0)

尝试不在参数中指定列大小:

cmd.Parameters.Add("?", OleDbType.Integer).Value = 1234;
cmd.Parameters.Add("?", OleDbType.BSTR).Value ="asdf";