为什么我需要OleDbCommand.Prepare()?

时间:2008-09-30 22:28:57

标签: c# .net stored-procedures ole

我正在使用数据网格和适配器,它通过存储的查询(名为“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存储过程/查询时,我是否需要一直这样做?为什么?我还有另一个项目即将到来,我将不得不用SqlDbCommand做同样的事情......我也必须用它们做这些吗?

3 个答案:

答案 0 :(得分:3)

奇怪的是,这是一个准备好的声明,它们实际上非常好。基本上你要么创建或获取一个sql语句(插入,删除,更新)而不是传递实际值,你传递“?”作为占位符。这一切都很好,除了我们想要的是我们传递的值而不是“?”。

所以我们准备语句而不是“?”,我们传递上面的参数,这些参数将是代替占位符的值。

准备解析字符串以查找参数可以替换问号的位置,这样您只需输入参数数据并执行命令。

在oleDB中,存储的查询是预处理语句,因此需要准备。我没有使用存储的查询与SqlDB,所以我不得不遵循以前的2个答案。

答案 1 :(得分:0)

我不使用它与SqlDbCommand。对我来说似乎是一个错误,它是必需的。如果你要连续多次调用一个过程,那么只有很好才能拥有。也许我错了,并且在关于过多喜欢这个电话的提供商的文档中有一个注释。

答案 2 :(得分:0)

您使用的是JET OLEDB Provider吗?还是MSDASQL + JET ODBC?

您不应该致电Prepare(),但我相信这是驱动程序/提供商的依赖。

您绝对不需要Prepare()使用System.Data.SqlClient