欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

mssql2008 自定义表类型实现(批量插入或者修改)

程序员文章站 2024-02-13 14:59:46
在做大型网站或者系统的时候,经常会遇到个问题就是批量插入或者修改数据库。如果遇到这个问题,还是一条条记录来处理,这样的效率太低了,所以要考虑批量插入或者修改 今天这边不讲s...
在做大型网站或者系统的时候,经常会遇到个问题就是批量插入或者修改数据库。如果遇到这个问题,还是一条条记录来处理,这样的效率太低了,所以要考虑批量插入或者修改

今天这边不讲sqlbulkcopy,只简单讲sql自定义表类型。因为目前的项目我用到了分表的方式,用存储过程比较方便自动创建分表。现在把我目前写的功能简单做个记录,也方便以后自己查阅

第一步,在数据库里点击 新建查询 创建相应的sql
复制代码 代码如下:

--======自定义表类型demo======
--创建表
create table tab
(
tabvalue varchar(10)
)
go
--创建自定义表类型
create type type_tab as table
(
type_tabvalue varchar(10)
)
go
--创建 存储过程
create procedure p_tab
(
@ptab type_tab readonly
)
as
begin
insert into tab select * from @ptab
end
--sql 测试表类型 type1
declare @tt type_tab
insert into @tt values('a')
insert into @tt values('b')
insert into @tt values('c')
insert into tab select * from @tt
select * from tab
--sql 测试表类型 type2
declare @tt2 type_tab
insert into @tt2 values('a')
insert into @tt2 values('b')
insert into @tt2 values('c')
execute p_tab @tt2

第二步 asp.net 调用 存储过程
复制代码 代码如下:

using (sqlconnection conn =sqlhelper.settings.getsqlconnection(true))
{
try
{
datatable dtadd = new datatable();
dtadd.columns.add("tabvalue");
dtadd.columns["tabvalue"].datatype = system.type.gettype("system.string");
foreach (modelent rl in list)
{
datarow dr = dtadd.newrow();
dr["tabvalue"] = rl.tabvalue;
dtadd.rows.add(dr);
}
//int rt = sqlhelper.sqlhelper.sqlbulkcopy(dtadd, tablename, conn);
sqlcommand cmd = new sqlcommand("p_tab", conn);
cmd.commandtype = commandtype.storedprocedure;
cmd.parameters.add("@ptab", sqldbtype.structured).value =dtadd;
if (conn.state == connectionstate.closed)
{
conn.open();
}
return cmd.executenonquery();
}
catch (exception ex)
{
#if debug
throw ex;
#else
return -10000;
#endif
}
finally
{
conn.close();
}

modelent 是tab表对应的实体类。list 是modelent 的一个集合,这样可以实现多个row,这样就能一次插入多条记录。