对于多行数据的增加和修改,之前一直是使用循环,一条条调用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; } } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义