【问题标题】:OLEDB Parameterized QueryOLEDB 参数化查询
【发布时间】:2012-08-16 09:39:43
【问题描述】:
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。它发现列名很好,但内容是空的。

我该如何解决这个问题?

【问题讨论】:

  • 当您从 Access 手动运行并输入以上给定参数时,您是否查询返回行?
  • 您的第一个参数是整数,但您将其设置为字符串。
  • @BishnuPaudel 对不起,你能澄清一下吗?我不确定我是否理解你的问题。我所知道的是,如果我使用 OleDBCommandBuilder 而不是参数化查询,那么整个事情都会完美运行。
  • @LarsTech 已修复。还是不行。
  • 考虑使用您的 sql 和两个参数字段在 Access 中创建一个查询,然后调用该查询而不是传递 sql

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


【解决方案1】:

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

【讨论】:

  • 感谢您的示例...这方面的文档很糟糕。
  • 同意,我在互联网的深处寻找它。
【解决方案2】:

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

dataGridView1.DataSource = ds.Tables[0];

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

【讨论】:

  • 正如您所建议的,我在数据表上放置了一个断点,当数据获取列时,它没有获取行。可能的原因是什么?
  • 所以 ds.Tables[0].Rows.Count == 0?您是否也在 Access 中运行 SQL 以验证输出?
  • 没关系,是我的 SQL 查询有问题。谢谢。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 2014-03-22
    相关资源
    最近更新 更多