【问题标题】:Why do I need OleDbCommand.Prepare()?为什么我需要 OleDbCommand.Prepare()?
【发布时间】:2008-09-30 22:28:56
【问题描述】:

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

【问题讨论】:

    标签: c# .net stored-procedures ole


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      我不将它与 SqlDbCommand 一起使用。在我看来,它是必需的一个错误。如果您要连续多次调用一个过程,它应该很高兴。也许我错了,文档中有一条说明提供者非常喜欢这个调用。

      【讨论】:

        【解决方案3】:

        您是否在使用 JET OLEDB 提供程序?还是 MSDASQL + JET ODBC?

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

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

        【讨论】:

          猜你喜欢
          • 2019-06-09
          • 2012-05-21
          • 1970-01-01
          • 1970-01-01
          • 2014-06-18
          • 2017-02-26
          • 2011-04-03
          • 2019-02-21
          • 2017-07-27
          相关资源
          最近更新 更多