为何用参数化OLEDB命令更新MS Access时抛出OleDbException参数缺失错误
问题解决方法
- 替换命名参数为位置占位符
OLE DB 驱动访问Access数据库时不支持按参数名匹配,仅严格按照参数在SQL语句中出现的先后顺序匹配参数。建议将SQL语句中的所有命名参数占位符替换为?,无需保留参数名,当前你添加参数的顺序和SQL参数顺序一致,替换后无需调整参数添加顺序:
string x = "UPDATE CharMain " + "SET CharMain.SpeciesAndStock = ?, " + "CharMain.Mig = ?, " + "CharMain.Con = ?, " + "CharMain.Dex = ?, " + "CharMain.Per = ?, " + "CharMain.[Int] = ?, " + "CharMain.Res = ?, " + "CharMain.[Size] = ?, " + "CharMain.Stride = ? " + "WHERE CharMain.[ID] = ?;";
- 处理空值参数
如果任意传入参数(比如speciesStock、array集合中的取值、size等)为C#的null,OLE DB驱动会判定该参数未传值,直接抛出对应异常。需要将所有C#空值替换为DBNull.Value后再传入参数,示例如下:
param[0] = new OleDbParameter("@SpeciesStock", speciesStock ?? DBNull.Value); // 其余所有参数都按照该逻辑处理空值即可
- 可选优化:显式指定参数类型
可以给每个参数显式指定OleDbType,避免驱动自动类型推断出错,示例:
param[0] = new OleDbParameter("@SpeciesStock", OleDbType.VarChar) { Value = speciesStock ?? DBNull.Value };
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

