快速玩转 SQL Server中带 表类型参数 的存储过程 —附源码
摘要:
最近做项目中遇到批量添加和修改的问题,在老大的指导下学会了使用表类型参数来做批量操作。为了巩固强化,围绕这个技术又做了个小demo。
开始正题:
首先,我们在SQL Server 2008下创建一个示例数据库名为TableTypeTest,再在该数据库下创建一个名为Class和Student的表,结构如下:
再在TableTypeTest数据库下创建一个自定义表类型,取名StudentType,如下:

CREATE TYPE [dbo].[StudentType] AS TABLE( [SID] [int] NOT NULL, [CID] [int] NOT NULL, [SName] [nvarchar](50) NOT NULL ) GO
然后,创建两个存储过程,批量添加和批量修改,分别为InserNewStudent和UpdateStudent,如下
InserNewStudent:

CREATE PROCEDURE [dbo].[InserNewStudent] @Dt dbo.StudentType readonly AS BEGIN insert into dbo.Student(CID,SName) select t.CID,t.SName from @Dt as t END GO
UpdateStudent:

CREATE PROCEDURE [dbo].[UpdateStudent] @Dt dbo.StudentType readonly AS BEGIN Update dbo.Student set CID=t.CID,SName=t.SName from @Dt as t where dbo.Student.[SID]=t.[SID] END GO
启动Visual Studio 2010,创建一个默认的窗体应用程序,窗体用于显示所有班级列表,操作每个班级下的学生通过选中该班级,然后右键操作。如下:
创建显示班级下的所有学生列表窗体,如下:
创建批量添加学生的窗体,如下:
关键代码如下:

/// <summary> /// 批量添加 /// </summary> public static bool AddBantch(DataTable dt) { string pName = "dbo.InserNewStudent"; List<SqlParameter> pList = new List<SqlParameter>() { DbHelper.CreateSqlParemeterStructured("@Dt",dt) }; try { DbHelper.RunProcedure(pName, pList); return true; } catch { return false; } }

private void button1_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(this.textBox1.Text) || string.IsNullOrEmpty(this.textBox4.Text) || string.IsNullOrEmpty(this.textBox6.Text)) { MessageBox.Show("不能有空文本框"); } else { DataTable dt = new DataTable(); dt.Columns.Add("SID"); dt.Columns.Add("CID"); dt.Columns.Add("SName"); DataRow dr; dr = dt.NewRow(); dr["SID"] = 0;//此列虽然在添加的时候无用,但必须赋值,否则报错 dr["CID"] = CID; dr["SName"] = this.textBox1.Text; dt.Rows.Add(dr); dr = dt.NewRow(); dr["SID"] = 0; dr["CID"] = CID; dr["SName"] = this.textBox4.Text; dt.Rows.Add(dr); dr = dt.NewRow(); dr["SID"] = 0; dr["CID"] = CID; dr["SName"] = this.textBox6.Text; dt.Rows.Add(dr); if (Library.AddBantch(dt)) { MessageBox.Show("批量添加成功!"); this.Close(); } else { MessageBox.Show("批量添加失败!"); this.Close(); } } }
创建批量更改班级学生姓名的窗体,如下:
关键代码如下:

/// <summary> /// 批量修改 /// </summary> public static bool UpdateBantch(DataTable dt) { string pName = "dbo.UpdateStudent"; List<SqlParameter> pList = new List<SqlParameter>() { DbHelper.CreateSqlParemeterStructured("@Dt",dt) }; try { DbHelper.RunProcedure(pName, pList); return true; } catch { return false; } }

private void button1_Click(object sender, EventArgs e) { int rows = this.dataGridView1.Rows.Count; DataTable dt = new DataTable(); dt.Columns.Add("SID"); dt.Columns.Add("CID"); dt.Columns.Add("SName"); DataRow dr; for (int i = 0; i < rows;i++ ) { DataGridViewRow dtr=this.dataGridView1.Rows[i]; dr = dt.NewRow(); dr["SID"] = dtr.Cells[0].Value; dr["CID"] = dtr.Cells[1].Value; dr["SName"] = dtr.Cells[2].Value; dt.Rows.Add(dr); } if (Library.UpdateBantch(dt)) { MessageBox.Show("批量更改成功!"); } else { MessageBox.Show("批量更改失败!"); } }
PS:数据库连接要在程序中的App.Config中配置
正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!
希望能和在读此文的朋友们碰撞一些激情的火花,此公众号会不定时推送一些属于我们程序员的有用信息与优质内容,欢迎关注交流!
作者:施瓦小辛格
出处:http://www.cnblogs.com/wenyang-rio/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
出处:http://www.cnblogs.com/wenyang-rio/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!