【问题标题】:Updating Oracle database throws illegal variable name/number exception更新 Oracle 数据库引发非法变量名称/编号异常
【发布时间】:2014-02-14 18:48:03
【问题描述】:

我正在尝试更新 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') 的正确值。任何帮助表示赞赏!

【问题讨论】:

  • 如果你把 :stateCode addParameter 放在 id addParameter 之前会起作用吗?
  • @BrianMcGinity - 是的,它成功了!对我来说,为什么改变位置可以解决它没有意义......
  • 出于某种原因,Oracle 喜欢按照它们在 sql 语句中出现的顺序来了解绑定变量。就好像 Oracle 是按位置绑定的。我在存储过程中编写动态sql时遇到了同样的问题。
  • 我会写这个作为答案,以防有人搜索同样的问题......

标签: c# oracle exception


【解决方案1】:

颠倒顺序修复它:

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

由于某种原因,Oracle 喜欢按照它们在 sql 语句中出现的顺序来了解绑定变量。就好像 Oracle 是按位置绑定的。我在存储过程中写动态sql时遇到了同样的问题。

【讨论】:

  • 它解决了这个问题。感谢您的帮助!
  • 只想提一下,很多时候在存储过程中编写sql要容易得多,因为sql语句中的变量会自动成为绑定变量。如果需要做复杂的db操作,可以考虑写plsql,从c#调用。
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 2013-01-06
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 2014-11-12
  • 2015-08-14
相关资源
最近更新 更多