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

我该如何解决这个问题?

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

 dataGridView1.DataSource = ds.Tables[0]; 

dataGridView1的前端绑定是什么样的? 在Access中运行查询可以揭示一些情况。

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

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

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