我正在使用数据网格和适配器,它通过存储的查询(名为“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做同样的事情......我也必须用它们做这些吗?
答案 0 :(得分:3)
奇怪的是,这是一个准备好的声明,它们实际上非常好。基本上你要么创建或获取一个sql语句(插入,删除,更新)而不是传递实际值,你传递“?”作为占位符。这一切都很好,除了我们想要的是我们传递的值而不是“?”。
所以我们准备语句而不是“?”,我们传递上面的参数,这些参数将是代替占位符的值。
准备解析字符串以查找参数可以替换问号的位置,这样您只需输入参数数据并执行命令。
在oleDB中,存储的查询是预处理语句,因此需要准备。我没有使用存储的查询与SqlDB,所以我不得不遵循以前的2个答案。
答案 1 :(得分:0)
我不使用它与SqlDbCommand。对我来说似乎是一个错误,它是必需的。如果你要连续多次调用一个过程,那么只有很好才能拥有。也许我错了,并且在关于过多喜欢这个电话的提供商的文档中有一个注释。
答案 2 :(得分:0)
您使用的是JET OLEDB Provider吗?还是MSDASQL + JET ODBC?
您不应该致电Prepare()
,但我相信这是驱动程序/提供商的依赖。
您绝对不需要Prepare()
使用System.Data.SqlClient
。