我正在使用与MSAccess表对应的数据网格和适配器,通过存储的查询(名为“UpdatePaid”,如下所示的3个参数),如下所示:

    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()调用之前,没有
< br>我的问题是:在使用OleDb存储过程/查询时,我是否需要一直这样做?为什么?我还有另一个项目即将到来,我将不得不用SqlDbCommand做同样的事情......我也必须用它们做这些吗?

有帮助吗?

解决方案

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

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

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

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

其他提示

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

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

您不需要调用 Prepare(),但我相信它依赖于驱动程序/提供程序。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top