有時需要將記憶體中的表與資料庫中的表比較,比如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)ASBEGINSELECT b.* FROM @temp_20190915 a JOIN TempUser b ON a.ID=b.IDEND
注意事項:存盤程序的引數型別是剛剛新建的【用戶表型別】并且是只讀的
此時在存盤程序中我們可以把【用戶表型別】當作一張正常表的去處理需要的資料(注意是只讀)
4、記憶體中構建我們的Datatable
var data = https://www.cnblogs.com/xiao-sheng/p/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= https://www.cnblogs.com/xiao-sheng/p/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 }ExecProcDataSet
6、除錯可以看到data就是我們需要的資料
總結:【用戶 定義表型別】的方便之處就是可以將記憶體中Datatable很好的很資料庫中的表結合
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/41461.html
標籤:SQL Server
上一篇:資料庫離線、在線

