代码之家  ›  专栏  ›  技术社区  ›  BKimmel

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

  •  1
  • BKimmel  · 技术社区  · 18 年前

    我正在使用datagrid和适配器,它们通过存储的查询(名为“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();
    

    它很好用…但真正奇怪的是它 没有 直到我把它放进去 呼叫

    因此,我的问题是:在处理OleDb存储过程/查询时,是否需要一直这样做?为什么?我还有另一个项目要做,我必须用SqlDbCommand做同样的事情。。。我也要用这些吗?

    3 回复  |  直到 17 年前
        1
  •  4
  •   Fry    18 年前

    奇怪的是,这被称为一份事先准备好的声明,它们实际上非常好。基本上,您可以创建或获取sql语句(insert、delete、update),而不是传递实际值,而是传递“?”作为占位符。这一切都很好,除了我们希望传递的是我们的值,而不是“?”。

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

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

    在oleDB中,存储的查询是prepared语句,因此需要prepare。我没有在SqlDB中使用存储查询,因此我不得不遵循前面的两个答案。

        2
  •  0
  •   GSerg    18 年前

    我不将它与SqlDbCommand一起使用。在我看来,这是一个错误 . 应该是 很高兴有 如果要连续多次调用某个过程。也许我错了,文档中有一条说明,供应商太喜欢这个电话了。

        3
  •  0
  •   Brannon    18 年前

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

    你不需要打电话 Prepare() ,但我认为这取决于驱动程序/提供商。

    准备() 对于 System.Data.SqlClient

    推荐文章