为什么需要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个答案。