为什么需要OleDbCommand.Prepare()?
时间:2020-03-06 14:57:06 来源:igfitidea点击:
我正在使用通过存储的查询(名为" UpdatePaid",如下所示的3个参数)与MSAccess表对应的数据网格和适配器,如下所示:
OleDbCommand odc = new OleDbCommand("UpdatePaid", connection); OleDbParameter param; odc.CommandType = CommandType.StoredProcedure; param = odc.Parameters.Add("v_iid", OleDbType.Double); param.SourceColumn = "I"; param.SourceVersion = DataRowVersion.Original; param = odc.Parameters.Add("v_pd", OleDbType.Boolean); param.SourceColumn = "Paid"; param.SourceVersion = DataRowVersion.Current; param = odc.Parameters.Add("v_Projected", OleDbType.Currency); param.SourceColumn = "ProjectedCost"; param.SourceVersion = DataRowVersion.Current; odc.Prepare(); myAdapter.UpdateCommand = odc; ... myAdapter.Update();
它工作正常……但是真正奇怪的是,直到我输入odc.Prepare()调用它才起作用。
因此,我的问题是:使用OleDb存储的proc /查询时,我是否需要一直这样做?为什么?我还要提出另一个项目,在该项目中我必须使用SqlDbCommand做同样的事情...我也必须使用这些做吗?
解决方案
我不使用它与SqlDbCommand。对我来说,这是一个错误,它是必需的。仅当我们要连续多次调用某个过程时,才应该很好。也许我是错的,并且文档中有一条注释,说明过分喜欢此调用的提供程序。
我们正在使用JET OLEDB Provider吗?还是MSDASQL + JET ODBC?
我们不必调用Prepare()
,但我相信这取决于驱动程序/提供程序。
我们绝对不需要为System.Data.SqlClient使用Prepare()。
奇怪的是,这被称为准备好的语句,它们实际上非常好。基本上,我们将创建或者获取一个sql语句(插入,删除,更新),而不是传递实际值,而是传递"?"。作为占位符。这一切都很好,只是我们要传递的是我们的价值观而不是"?"。
因此,我们准备语句,而不是"?",而是像上面一样传递参数,这些参数将代替占位符。
准备分析字符串以查找参数可以替换问号的位置,因此我们所要做的就是输入参数数据并执行命令。
在oleDB中,存储的查询是准备好的语句,因此需要准备。我没有在SqlDB中使用存储的查询,因此我不得不遵照前面的2个答案。