2

我正在使用通过存储查询(名为“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 做同样的事情......我也必须用这些做吗?

4

3 回答 3

4

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

因此,我们准备了语句,而不是“?”,而是像上面一样传入参数,这些参数将代替占位符的值。

准备解析字符串以查找参数可以替换问号的位置,因此您所要做的就是输入参数数据并执行命令。

在 oleDB 中,存储的查询是准备好的语句,因此需要准备。我没有使用 SqlDB 的存储查询,所以我不得不推迟到前面的 2 个答案。

于 2008-10-01T04:30:49.490 回答
0

我不将它与 SqlDbCommand 一起使用。对我来说,它似乎是一个错误,它是必需的。如果您要连续多次调用一个过程,它应该只是很好。也许我错了,文档中有一条关于过于喜欢这个调用的提供者的注释。

于 2008-09-30T23:22:17.987 回答
0

您在使用 JET OLEDB 提供程序吗?或 MSDASQL + JET ODBC?

您不需要致电Prepare(),但我相信这取决于驱动程序/供应商。

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

于 2008-09-30T23:27:24.667 回答