|
有时需要将内存中的表与数据库中的表比较,比如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];
复制代码- public static DataSet ExecProcDataSet(string procName, SqlParameter[] parameters, string connStr)
- {
- using (SqlConnection conn = new SqlConnection(connStr))
- {
- conn.Open();
- SqlCommand cmd = GetSqlCommand(conn, procName, CommandType.StoredProcedure, parameters);
- cmd.CommandTimeout = 0;
- SqlDataAdapter da = new SqlDataAdapter(cmd);
- DataSet ds = new DataSet();
- da.Fill(ds);
- cmd.Dispose();
- return ds;
- }
- }
- ExecProcDataSet
复制代码
6、调试可以看到data就是我们需要的数据
总结:【用户 定义表类型】的方便之处就是可以将内存中Datatable很好的很数据库中的表结合 |
|