C# 更新Oracle数据库引发非法变量名称/编号异常

C# 更新Oracle数据库引发非法变量名称/编号异常,c#,oracle,exception,C#,Oracle,Exception,我正在尝试更新Oracle数据库中的表。此代码与硬编码状态代码一起工作并更新记录: public WorkRates UpdateRecord(int id, string stateCode) { var sql = "update work_rates set state_code = 'WA' where id = :id"; var db = Db.Load(sql); db.AddParameter(":id", id); db.DoExecute(

我正在尝试更新Oracle数据库中的表。此代码与硬编码状态代码一起工作并更新记录:

public WorkRates UpdateRecord(int id, string stateCode)
{
    var sql = "update work_rates set state_code = 'WA' where id = :id";
    var db = Db.Load(sql);

    db.AddParameter(":id", id);

    db.DoExecute();

    return null;
}
当我将其更改为此:

public WorkRates UpdateRecord(int id, string stateCode)
{
    var sql = "update work_rates set state_code = :stateCode where id = :id";
    var db = Db.Load(sql);

    db.AddParameter(":id", id);
    db.AddParameter(":stateCode", stateCode);

    db.DoExecute();

    return null;
}

。。。它抛出异常“ORA-01036:非法变量名/编号”。函数public WorkRates UpdateRecord(int id,string stateCode)确实为stateCode('WA')获取了正确的值。感谢您的帮助

颠倒顺序修复它:

db.AddParameter(":stateCode", stateCode);
db.AddParameter(":id", id);

出于某种原因,Oracle希望知道绑定变量在sql语句中出现的顺序。这就好像甲骨文是按位置绑定的。在存储过程中编写动态sql时,我也遇到了同样的问题。

如果将:stateCode addParameter放在id addParameter之前,是否有效?@brianmcginy-是的,它有效!我不明白为什么改变位置可以解决这个问题……因为某种原因,Oracle喜欢按照绑定变量在sql语句中出现的顺序来了解它们。这就好像甲骨文是按位置绑定的。在存储过程中编写动态sql时,我也遇到过同样的问题。我将写这篇文章作为一个答案,以防有人搜索到同样的问题……它解决了这个问题。谢谢你的帮助!只是想提到,很多时候,在存储过程中编写sql要容易得多,因为sql语句中的变量会自动成为绑定变量。如果需要进行复杂的DB操作,请考虑编写PLSQL并从C调用它。