.NET如何在数据访问层往存储过程中传List集合?

时间:2022-03-10 01:45:07
我有30个用户对象要往数据库里存,有一个存错了,就全部失败,我就想到了事务,可是查了一下,在代码中开事务,好象要用到connection对象,我不想改数据访问层,在业务也又不想引用connection,所以想在存储过程中加事务,但是不知道如何把一个保存了30个对象的集合传过去..存储过程中该用什么类型来接受呢?

18 个解决方案

#1


这么批量的更新操作,是不是统一更新字段??
如果是这样,直接传id和需要更改的内容就行了。

#2


不可能.

#3


囧,竟然是不可能...

#4


用CLR形式的存储过程吧

#5


希望能详细一点

#6


 数组啊 吧你的30个集合 以数组的形式 当参数传进 存储过程!

#7


引用 6 楼 lyvscf 的回复:
数组啊 吧你的30个集合 以数组的形式 当参数传进 存储过程!

您说的是
Object[30] obj = {user1,user2...};
可是user也是可封装了很多数据的对象,我在存储过程中又该怎么取user对象里的值呢?

#8


     你这样做也可以!

#9


  你就是一个 list.count =30 么!?
   直接这样嘛!
  先在外面读出来 直接将 这个list 传进SP
  到SP里面来遍历插入
  循环之前定义一个 savapoint
  遇到异常 直接 回滚! 就ok了

#10


引用 8 楼 lyvscf 的回复:
    你这样做也可以!

???怎么做???????

#11


引用 9 楼 lyvscf 的回复:
  你就是一个 list.count =30 么!?
  直接这样嘛!
  先在外面读出来 直接将 这个list 传进SP
  到SP里面来遍历插入
  循环之前定义一个 savapoint
  遇到异常 直接 回滚! 就ok了

可是我在存储过程中该怎么接收呢?又怎么读取?

#12


sql2008可以接受数据集作为传入参数
(我记不清是行集还是数据集了,反正可以满足楼主的需要)

#13


引用 12 楼 microtry 的回复:
sql2008可以接受数据集作为传入参数
(我记不清是行集还是数据集了,反正可以满足楼主的需要)

我用的是2005....

#14


引用楼主 j5782r3qan23 的回复:
我就想到了事务,可是查了一下,在代码中开事务,好象要用到connection对象,我不想改数据访问层,在业务也又不想引用connection,所以想在存储过程中加事务,但是不知道如何把一个保存了30个对象的集合传过去..存储过程中该用什么类型来接受呢?

首先...事务不只是指数据库事务...你查的方法不对,去看看System.Transactions命名空间...

其次...现在的主流DBMS基本上都是关系型数据库,无法支持你的业务对象,不可以传递对象参数...

最后...较新的DBMS可以使用XML类型,你可以在SP中解析XML,不过得不偿失...

#15


有點難度,學習一下樓上的分析方法,
LZ搞定了把方法給大伙介紹哈阿 

#16


  把 list 作为 数组传到sp
  那在sp 肯定也要用 数组接受
  create or replace package aa
is
 type string_array is table of varchar2(100) index by binary_integer;
 type int_array is table of number  index by binary_integer;
PROCEDURE AddProductVolume
(
 P_CID in varchar2,
 P_PSID in string_array,
 P_INTEGRAL in int_array,
 P_INTEGRALSTARTDATE in string_array,
 P_INTEGRALENDDATE in string_array,
  P_PRICE in int_array,
 p_ret out int_array 
);
end aa;
这是oracle 的列子!你自己对照这看吧

#17


呵呵,好像SqlSv05没什么好办法,你应该历遍行集逐个提交

#18


多步操作好像无法回滚吧,你可是测试一下

#1


这么批量的更新操作,是不是统一更新字段??
如果是这样,直接传id和需要更改的内容就行了。

#2


不可能.

#3


囧,竟然是不可能...

#4


用CLR形式的存储过程吧

#5


希望能详细一点

#6


 数组啊 吧你的30个集合 以数组的形式 当参数传进 存储过程!

#7


引用 6 楼 lyvscf 的回复:
数组啊 吧你的30个集合 以数组的形式 当参数传进 存储过程!

您说的是
Object[30] obj = {user1,user2...};
可是user也是可封装了很多数据的对象,我在存储过程中又该怎么取user对象里的值呢?

#8


     你这样做也可以!

#9


  你就是一个 list.count =30 么!?
   直接这样嘛!
  先在外面读出来 直接将 这个list 传进SP
  到SP里面来遍历插入
  循环之前定义一个 savapoint
  遇到异常 直接 回滚! 就ok了

#10


引用 8 楼 lyvscf 的回复:
    你这样做也可以!

???怎么做???????

#11


引用 9 楼 lyvscf 的回复:
  你就是一个 list.count =30 么!?
  直接这样嘛!
  先在外面读出来 直接将 这个list 传进SP
  到SP里面来遍历插入
  循环之前定义一个 savapoint
  遇到异常 直接 回滚! 就ok了

可是我在存储过程中该怎么接收呢?又怎么读取?

#12


sql2008可以接受数据集作为传入参数
(我记不清是行集还是数据集了,反正可以满足楼主的需要)

#13


引用 12 楼 microtry 的回复:
sql2008可以接受数据集作为传入参数
(我记不清是行集还是数据集了,反正可以满足楼主的需要)

我用的是2005....

#14


引用楼主 j5782r3qan23 的回复:
我就想到了事务,可是查了一下,在代码中开事务,好象要用到connection对象,我不想改数据访问层,在业务也又不想引用connection,所以想在存储过程中加事务,但是不知道如何把一个保存了30个对象的集合传过去..存储过程中该用什么类型来接受呢?

首先...事务不只是指数据库事务...你查的方法不对,去看看System.Transactions命名空间...

其次...现在的主流DBMS基本上都是关系型数据库,无法支持你的业务对象,不可以传递对象参数...

最后...较新的DBMS可以使用XML类型,你可以在SP中解析XML,不过得不偿失...

#15


有點難度,學習一下樓上的分析方法,
LZ搞定了把方法給大伙介紹哈阿 

#16


  把 list 作为 数组传到sp
  那在sp 肯定也要用 数组接受
  create or replace package aa
is
 type string_array is table of varchar2(100) index by binary_integer;
 type int_array is table of number  index by binary_integer;
PROCEDURE AddProductVolume
(
 P_CID in varchar2,
 P_PSID in string_array,
 P_INTEGRAL in int_array,
 P_INTEGRALSTARTDATE in string_array,
 P_INTEGRALENDDATE in string_array,
  P_PRICE in int_array,
 p_ret out int_array 
);
end aa;
这是oracle 的列子!你自己对照这看吧

#17


呵呵,好像SqlSv05没什么好办法,你应该历遍行集逐个提交

#18


多步操作好像无法回滚吧,你可是测试一下