c# - 使用 ODP.NET 更新 Oracle 表的参数化 OracleCommand/绑定(bind)变量?

标签 c# oracle plsql odp.net

我有一个 Oracle 11g 表,其中包含以下列名称和类型:

ID VARCHAR2(32 BYTE)
VERSION VARCHAR2(12 BYTE)

我正在尝试使用 ODP.NET 和 C# 让绑定(bind)变量在 Oracle 参数化命令中用于此表上的更新语句,但我没有运气。这是我正在使用的代码:

string constr = gconstr + "; Data Source=" + db;
OracleConnection con = new OracleConnection(constr);
con.Open();
ddiId = "WS_5043";
ddiVer = "1.0.3";

string UPDATE_CLOB_QUERY = "UPDATE :ddiTable SET version=:ddiVer WHERE id=:ddiId";

Oracle.DataAccess.Types.OracleXmlType ret;
OracleCommand oracleCommand2 = new OracleCommand(UPDATE_CLOB_QUERY, con);
oracleCommand2.Parameters.Clear();
oracleCommand2.Parameters.Add("ddiId", OracleDbType.Varchar2, ParameterDirection.Input).Value = ddiId;
oracleCommand2.Parameters.Add("ddiTable", OracleDbType.Varchar2, ParameterDirection.Input).Value = ddiTable;
oracleCommand2.Parameters.Add("ddiVer", OracleDbType.Varchar2, ParameterDirection.Input).Value = ddiVer;
oracleCommand2.ExecuteNonQuery();
oracleCommand2.Dispose();

当我在 VS2010 中运行上述代码时,出现以下 Oracle 错误:

ORA-01036: illegal variable name/number

但是,当我删除 SQL 中的绑定(bind)变量声明时,上面的内容就会起作用,即

string UPDATE_CLOB_QUERY = "UPDATE wstable SET version='1.0.2' WHERE id='WS_5043'";

我做错了什么?

我需要知道如何使用 SQL 更新命令(例如上面的命令)获取绑定(bind)变量和参数化 Oracle 命令,因为我最终将开始更新其他表中的大型 Clob(并将 Clob 连接为 SQL 中的字符串)当然会导致大小限制错误)。因此,让它发挥作用将是第一个胜利。

最佳答案

在这一行;

oracleCommand2.Parameters.Add("ddiTable", OracleDbType.Varchar2, ParameterDirection.Input).Value = ddiTable;

您实际上尝试添加表名称 (ddiTable) 作为参数。你不能那样做。并且没有必要添加查询表名称作为参数。如果你想使用 Parameters.Add()具有 3 个参数的方法,您必须使用如下参数;

public OracleParameter Add(
    string parameterName,
    OracleType dataType,
    int size
)

这是唯一适合重载的方法。获取第三个参数类型 ParameterDirection.Input 没有重载的Parameters.Add()方法。

I need to know how to get bind variables and parameterized Oracle commands working with SQL Update commands such as the one above as a requirement.

我建议您阅读这些内容;

关于c# - 使用 ODP.NET 更新 Oracle 表的参数化 OracleCommand/绑定(bind)变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14225075/

相关文章:

c# - 模拟扩展方法导致 System.NotSupportedException

c# - MSBuild 未生成发布网页 (ClickOnce)

java - 通过java程序过滤数据还是删除oracle db中的行效率更高?

mysql - 讨论数据库表变更的触发器

oracle - 使用 Oracle 存储过程压缩

sql - Hive 中的错误 : Underlying error: org. apache.hadoop.hive.ql.exec.UDFArgumentTypeException:需要一个或多个参数

database - PL/SQL模拟表单POST

c# - 在递归调用中跟踪 parent

c# - 无法设置 Content-Type header

oracle - 必须声明 pl/sql PLS-00201 标识符