求助,Oracle数据库中数据参数传递问题

佩奇是乔治的姐姐 2013-07-01 01:08:01
背景:数据库采用ORACLE
在数据访问层
Oracle.DataAccess.Client.OracleParameter pram1 = new Oracle.DataAccess.Client.OracleParameter("p_cursor",Oracle.DataAccess.Client.OracleDbType.RefCursor);
pram1.Direction = ParameterDirection.Output;
cmd.Parameters.Add(pram1);

这里的时候取出的参数是输出是没有问题的



问题是:如何输入时能够把一个集合当输入参数传递给ORACLE的存储过程?以下代码出错提示是参数传递错误。
有经验的朋友们们给点建议,如何我能把一个DataTable集合做为一个传递参数给这个存储过程
代码简单的略写为以下:

OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
OracleTransaction txn = conn.BeginTransaction(IsolationLevel.ReadCommitted);
cmd.Transaction = txn;
cmd.CommandText = @"p_insert_dataset_l1";
cmd.CommandType = CommandType.StoredProcedure;
OracleParameter pTable = new OracleParameter("ds_insert", OracleDbType.RefCursor);
pTable.Value = dt; //----这里,组合了一个有行和列的DataTable,并且有内容,传递进入
cmd.Parameters.Add(pTable);
cmd.ExecuteNonQuery();
txn.Commit();
txn.Dispose();
cmd.Dispose();
...全文
227 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
楼上说的没错,就是因为传递过去的内容不能够被解析。 而OracleDbType.RefCursor似乎是不能做输入的。 其实如果真的用xml方式传递进入再在数据库语法中做解析再入库就未必比从程序中组织好好直接出库快多少。 故这个xml方式我还是持保留态度 非常感谢大家的主意。效率优化之后再静心做研究了
  • 打赏
  • 举报
回复
引用 2 楼 liujialei7273 的回复:
楼上的意思我也考虑过,但不管是在数据库中做字符串拼接或者解析或者在程序中做拼接解析,其实都是需要花不少的时间去解析的。这样的效率和一条条往数据库里去插入或者增加事务一千条一千条提交的速度是一样的。没有达到入库速度提高的目的 我的问题是否有可能,输入参数就是一个集合(DataTable或者DataSet) 存储过程的代码是这样的: create or replace procedure p_insert_dataset_l1(ds_insert sys_refcursor) is TYPE rc_channel_value IS RECORD(n_cha_id t_channel_value_l0.cdv_cha_id%TYPE, n_time t_channel_value_l0.cdv_timestamp%TYPE, n_val t_channel_value_l0.cdv_val%TYPE); TYPE ty_cha_val IS TABLE OF rc_channel_value; tc_cha_val ty_cha_val; begin FETCH ds_insert BULK COLLECT INTO tc_cha_val; FORALL I IN 1..tc_cha_val.COUNT INSERT INTO t_channel_value_l1 VALUES (tc_cha_val(I).n_cha_id,tc_cha_val(I).n_time,tc_cha_val(I).n_val); commit; end p_insert_dataset_l1;
无论怎样,都有一个原则,即是你传递过去的内容能被数据库解析才行 能够解析的类型,建表的时候也能看到,你可以传字符串,可以xml,字符串就是要分离操作,貌似比较可行的就是结构规范化的XML,解析也方便
吴青峰 2013-07-01
  • 打赏
  • 举报
回复
将xml传到数据库,接下来即使怎么将xml数据类型的数据,解析出来,放入一张临时表,这样写数据库语句就非常简单了。
吴青峰 2013-07-01
  • 打赏
  • 举报
回复
DataTable或者DataSet如果是这两个,转xml就更简单了,如下: string xml = string.Empty; DataSet ds = new DataSet(); if (dt != null && dt.Rows.Count > 0) { ds.Tables.Add(dt.Copy()); xml = ds.GetXml(); dt.AcceptChanges(); }
吴青峰 2013-07-01
  • 打赏
  • 举报
回复
同意传xml,数据库不是有个xml类型吗,然后解析出你要操作的一张表,这张表(也就是xml)里面有你要操作的一个状态(也就是增、删或者改),这样你想怎么写数据库语句都可以了。挺高效的
EnForGrass 2013-07-01
  • 打赏
  • 举报
回复
引用 1 楼 Return_false 的回复:
你可以把DataTable集合序列化为XML,以XML字符串的方式传递给存储过程 然后再数据库中可以解析XML
同意。传xml字符串 oracle 解析xml字符串 参考http://blog.sina.com.cn/s/blog_a539013401015tdb.html
  • 打赏
  • 举报
回复
楼上的意思我也考虑过,但不管是在数据库中做字符串拼接或者解析或者在程序中做拼接解析,其实都是需要花不少的时间去解析的。这样的效率和一条条往数据库里去插入或者增加事务一千条一千条提交的速度是一样的。没有达到入库速度提高的目的 我的问题是否有可能,输入参数就是一个集合(DataTable或者DataSet) 存储过程的代码是这样的: create or replace procedure p_insert_dataset_l1(ds_insert sys_refcursor) is TYPE rc_channel_value IS RECORD(n_cha_id t_channel_value_l0.cdv_cha_id%TYPE, n_time t_channel_value_l0.cdv_timestamp%TYPE, n_val t_channel_value_l0.cdv_val%TYPE); TYPE ty_cha_val IS TABLE OF rc_channel_value; tc_cha_val ty_cha_val; begin FETCH ds_insert BULK COLLECT INTO tc_cha_val; FORALL I IN 1..tc_cha_val.COUNT INSERT INTO t_channel_value_l1 VALUES (tc_cha_val(I).n_cha_id,tc_cha_val(I).n_time,tc_cha_val(I).n_val); commit; end p_insert_dataset_l1;
  • 打赏
  • 举报
回复
你可以把DataTable集合序列化为XML,以XML字符串的方式传递给存储过程 然后再数据库中可以解析XML

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧