加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何使用带有ODP(Oracle.DataAccess)的>> prepared

发布时间:2020-12-15 18:08:02 所属栏目:百科 来源:网络整理
导读:我正在尝试执行准备好的SQL查询,该查询更新Oracle 10g数据库(10.2.0.1)中的CLOB字段. 如果我从SQL Developer内部执行以下查询并提供占位符的值,则没有问题.但是,如果我通过OracleCommand(Oracle.DataAccess.dll,版本1.102.0.1(我认为),.NET Framework 3.5)执
我正在尝试执行准备好的SQL查询,该查询更新Oracle 10g数据库(10.2.0.1)中的CLOB字段.

如果我从SQL Developer内部执行以下查询并提供占位符的值,则没有问题.但是,如果我通过OracleCommand(Oracle.DataAccess.dll,版本1.102.0.1(我认为),.NET Framework 3.5)执行它,
我收到以下错误消息.请注意,我们不使用默认的oracle客户端,因为我们需要批量插入.不幸的是,给定的ODP版本和.NET Framework版本是一项艰难的要求,我们可能不会改变它.

查询:

UPDATE master_table
SET    description = :description,modification_notes = :modification_notes
WHERE  master_id = :master_id;

错误:

ORA-00932: inconsistent datatypes: expected – got CLOB

进一步的信息:

参数分配如下:

var param_description = new OracleParameter(":description",OracleDbType.Clob);
param_description.Value = "Test";

我试过以下的事情:

>将to_clob()插入SQL查询
>将Oracle.DataAccess.Types.OracleClob对象分配给参数.

我也发现了以下描述,但我真的希望能够保留准备好的查询.

How to insert CLOB field in Oracle using C#

是否可以通过准备好的查询来完成此操作?

我附上了一个产生错误的完整示例. DESCRIPTION和MODIFICATION_NOTES是数据库中CLOB类型的两列.

输入数据:

>连接:OracleConnection到数据库
> master_id:要过滤的主键

码:
免责声明:我手动输入以下示例,可能存在实际代码中没有的错误

var query = "UPDATE master_table " + 
            "SET description = :description " + 
            "    modification_notes = :modification_notes " +
            "WHERE master_id = :master_id";

var param_master_id = new OracleParameter(":master_id",OracleDbType.Int64);
param_master_id.Value = master_id;

var param_description = new OracleParameter(":description",OracleDbType.Clob);
param_description.Value = "Test1";

var param_master_id = new OracleParameter(":modification_notes",OracleDbType.Clob);
param_description.Value = "Test2";

IDbCommand command = new OracleCommand(query,connection);
command.parameters.Add(param_master_id);
command.parameters.Add(param_description);
command.parameters.Add(param_modification_notes);

command.ExecuteNonQuery(); // this line throws an exception

解决方法

如果要按名称绑定,则需要将其设置为true.默认值是按添加的参数的顺序绑定.
cmd.BindByName = true;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读