1
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。它发现列名很好,但内容是空的。

我该如何解决这个问题?

4

3 回答 3

5

以下是参数化查询如何与 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 语句,您必须分配问号“?” 到每个参数,然后您必须在下面创建参数并按照您布置问号的顺序添加它们,以便将正确的数据放入正确的字段中。

于 2015-03-05T23:24:25.570 回答
2

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

dataGridView1.DataSource = ds.Tables[0];

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

于 2012-08-21T04:17:57.560 回答
0

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

cmd.Parameters.Add("?", OleDbType.Integer).Value = 1234;
cmd.Parameters.Add("?", OleDbType.BSTR).Value ="asdf";
于 2012-08-21T05:51:22.247 回答