对于多行数据的增加和修改,之前一直是使用循环,一条条调用insert或update语句,这样后台会不停与sqlserver建立连接,会严重影响SQLSERVER的性能,现使用用户定义表类型,解决此问题,后台将插入或修改的数据转为DataTable,然后传入参数,调用存储过程,本次案例使用vs2019和SQL Server2014。
1.创建自定义表类型:点击 数据库---db_ERP(数据库名称)---可编译性---类型---用户定义表类型---右键 新建用户定义表类型
CREATE TYPE InsertTPerson AS TABLE ( [FName] [varchar](30) NULL, [FCITY] [varchar](20) NULL, [FAGE] [int] NULL, [FSalary] [decimal](18, 0) NULL )
2.创建存储过程
CREATE PROCEDURE InsertT_Person @dt dbo.InsertTPerson readonly AS BEGIN INSERT INTO T_Person SELECT FName ,FCity ,FAge ,FSalary FROM @dt END
3.c#代码:注意datatable字段必须与建立的自定义表类型字段顺序一致,不一致会出错,此方法还有一个就是执行结果返回为0,所以不能根据执行行数判断结果
using System.Data.SqlClient; using System.Data; namespace ThreadDemo { class Program { static void Main(string[] args) { DataTable dt = new DataTable(); dt.Columns.Add("FName"); dt.Columns.Add("FCity"); dt.Columns.Add("FAge"); dt.Columns.Add("FSalary"); DataRow row1 = dt.NewRow(); row1["FName"] = "小明"; row1["FCity"] = "哈尔滨"; row1["FAge"] = 27; row1["FSalary"] = 18000; dt.Rows.Add(row1); DataRow row2 = dt.NewRow(); row2["FName"] = "小蔡"; row2["FCity"] = "哈尔滨"; row2["FAge"] = 25; row2["FSalary"] = 10000; dt.Rows.Add(row2); InsertTPerson(dt); } private static void InsertTPerson(DataTable dt) { string connstr = "Server=.;database=db_ERP;integrated security=true;"; try { using (SqlConnection conn = new SqlConnection(connstr)) { SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "InsertT_Person"; cmd.Parameters.AddWithValue("@dt", dt); conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); } } catch (SqlException ex) { throw ex; } } } }