有时需要将内存中的表与数据库中的表比较,比如datatable中有100行数据,需要判断在数据库中是否存在,这个时候我们就可以使用sqlserver中的【用户 定义表类型】
这里最最最重要的思路是把【用户 定义表类型】当作一张虚拟的正常表去处理
需求:现在内存中有个datatable,数据库中有张表【tempuser】,需要在内存中取出 datatable和【tempuser】相同id的tempuser的信息
实现:
1、新建表
create table tempuser( id int not null identity(1,1) primary key, name nvarchar(100), age int ) insert tempuser values('a',1) insert tempuser values('b',2) insert tempuser values('c',3)
2、新建【用户表类型】
create type temp_20190915 as table ( id int )
3、新建存储过程
create proc proc_test_20190915(@temp_20190915 temp_20190915 readonly) as begin select b.* from @temp_20190915 a join tempuser b on a.id=b.idend
注意事项:存储过程的参数类型是刚刚新建的【用户表类型】并且是只读的
此时在存储过程中我们可以把【用户表类型】当作一张正常表的去处理需要的数据(注意是只读)
4、内存中构建我们的datatable
var data = new datatable(); data.columns.add("id", typeof(int));var row1 = data.newrow(); row1["id"] = 1; data.rows.add(row1); var row2 = data.newrow(); row2["id"] = 2; data.rows.add(row2);
5、调用存储过程
var p = new system.data.sqlclient.sqlparameter[1]; p[0] = new system.data.sqlclient.sqlparameter("@temp_20190915", data); var data= comm.tool.dbhelper.execprocdataset("proc_test_20190915", p, "数据库连接").tables[0];
1 public static dataset execprocdataset(string procname, sqlparameter[] parameters, string connstr) 2 { 3 using (sqlconnection conn = new sqlconnection(connstr)) 4 { 5 conn.open(); 6 sqlcommand cmd = getsqlcommand(conn, procname, commandtype.storedprocedure, parameters); 7 cmd.commandtimeout = 0; 8 sqldataadapter da = new sqldataadapter(cmd); 9 dataset ds = new dataset(); 10 da.fill(ds); 11 cmd.dispose(); 12 return ds; 13 } 14 }
6、调试可以看到data就是我们需要的数据
总结:【用户 定义表类型】的方便之处就是可以将内存中datatable很好的很数据库中的表结合