SQL Server将DataTable传入存储过程(Table Value Parameter)
博主在做毕业设计的时候,需要用到事务处理和多次将数据写入不同的表中,但是 SQL Server 数据库是不支持数组类型变量的,想要实现数组的功能,可以通过 XML 和数据表的方法实现,但是实现方法非常繁琐。
于是寻找其他更方便的解决方案,就发现了从 SQL Server 2008 开始,数据库开始支持“用户定义表类型”。通过它,可以实现将 .NET 程序构造的 DataTable 直接作为参数传入存储过程。
博主在运用的时候,遇到了些许问题,现在将它记录下来,以备今后查询。
1.首先确保数据库为 SQL Server 2008 及以上版本
2.新建一个表类型
CREATE TYPE dbo.AppFlag AS TABLE |
( |
ApplicationID int |
,Flag int |
) |
这样就建立了一个表类型,可以在【数据库】 -> 【可编程性】 -> 【类型】 -> 【用户定义表类型】中查看。
3.新建一个存储过程
CREATE PROCEDURE [dbo].[SetAppFlag] |
( |
@RoleID int |
,@AppFlagTable AppFlag READONLY --这里类型就用之前建立的表类型名称(AppFlag),切记必须加上READONLY,否则报错 |
) |
AS |
--将传递来的DataTable写入临时表#AppFlag |
IF OBJECT_ID(N'tempdb..#AppFlag',N'U') IS NOT NULL |
DROP Table #AppFlag |
SELECT * INTO #AppFlag FROM @AppFlagTable |
之后在存储过程中就可以想干嘛干嘛了
4.在 .NET 程序中构建 DataTable 并传递到存储过程
在这一步博主算是遇到了些问题,调试了一段时间。
因为博主对数据库的操作是用一个通用的数据库操作类,这个类,使用的是 DbCommand 这个基类,DbCommand.Parameters 中,只支持 DbType 类型。而我们需要的是 SqlCommand 这个继承于 DbCommand 的子类中的 SqlCommand.Parameters 的 SqlDbType 类型。就是这个问题,博主遇到了很多奇葩的报错。
博主使用的是 VB.NET ,要 C# 的转换下就好
'之前构造DataTable没有什么值得注意的地方 |
Dim SqlC As New SqlClient.SqlCommand |
Dim Conn As New SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("db").ConnectionString) |
Conn.Open() |
SqlC.Connection = Conn |
SqlC.CommandType = CommandType.StoredProcedure |
SqlC.CommandText = "SetAppFlag" |
SqlC.Parameters.Add("@RoleID", SqlDbType.Int) |
'这里后面必须带上类型,否则报错 |
SqlC.Parameters(0).Value = RoleID |
SqlC.Parameters.Add("@AppFlagTable", SqlDbType.Structured) |
'在要传递的DataTable后面,跟上SqlDbType.Structured类型 |
'博主发现使用DbType.Object类型会报错,所以不能使用博主的这个数据库操作类 |
SqlC.Parameters(1).Value = _DataTable |
SqlC.ExecuteNonQuery() |
Conn.Close() |
SqlC.Parameters.Clear() |
这样就可以直接传递 DataTable 了,其实也没什么难的…
SQL Server将DataTable传入存储过程(Table Value Parameter)的更多相关文章
- SQL Server技术问题之存储过程与sql语句的优缺点
优点: 1. 允许模块化程序设计.2.可维护性高,只需创建存储过程一次并将其存储在数据库中,以后即可在程序中调用该过程任意次.存储过程可独立于程序源代码而单独修改,而不需要更改.测试以及重新部署程序集 ...
- sql server 常用的系统存储过程
系统存储过程 说明 sp_databases 列出服务上的所有数据库 sp_helpdb 报告有关指定数据库或所有数据库的信息 sp_renamedb 更改数据库的名称 sp_tables 返回当 ...
- Sql Server 带参数的存储过程执行方法
Sql Server 带参数的存储过程执行方法 Visual C# 动态操作 SQL Server 数据库实例教程(4):带参数的存储过程执行方法 上一篇文章介绍了带参数的SQL语句执行方法和不带参数 ...
- SQL Server数据恢复准备之TRUNCATE TABLE理解
SQL Server数据恢复准备之TRUNCATE TABLE理解 转自:https://blog.51cto.com/aimax/2142553 易语随风去关注0人评论6717人阅读2018-07- ...
- [转] sql server 跨数据库调用存储过程
A库存储过程: create PROCEDURE [dbo].[spAAAForTest] ( ) =null , ) =null ) AS BEGIN select N'A' AS a , N'B' ...
- SQL Server的通用分页存储过程 未使用游标,速度更快!
经过一个下午的时间,和我一个同事(绝对是高手)的共同努力下,摸索出了以下的思路: 1.确定存储的输入参数: 1)SQL脚本,该参数接收完整的.正确的SQL检索文本,可将原应用中写好的SQL脚本直接传入 ...
- sql server 常用的扩展存储过程
sql server 里面提供了丰富的系统存储过程来辅助我们管理数据库以及开发.今天分享介绍一些常用的数据库扩展存储过程 xp_cmdshell 这个大家都比较熟悉了,使用xp_cmdshell 可以 ...
- SQL Server 2008 R2——T-SQL 存储过程 返回表
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- MS SQL Server之光标、存储过程和触发器
光标 通常数据库操作被认为是以数据集为基础的操作,但是光标被用于以记录为单位来进行操作,来获取数据库中的数据的子集.光标一般用于过程化程序里的嵌入的SQL语句. 对光标的定义如下: DECLARE C ...
随机推荐
- 【文文殿下】洛谷P2408 不同子串个数
题目链接https://www.luogu.org/problemnew/show/P2408 SAM裸题,大力求就行了 #include<cstdio> #include<cstr ...
- django入门-初窥门径-part1
尊重作者的劳动,转载请注明作者及原文地址 http://www.cnblogs.com/txwsqk/p/6510917.html 完全翻译自官方文档 https://docs.djangoproje ...
- [CISCO] Telete/SSH 之 Port 绑定/端口安全
[网络] Telete/SSH 之 Port 绑定/端口安全 一.前言 之前写完了网络] DHCP 之 Mac 绑定,CiSCO 交换机配置 SSH 登陆.这次我们再试试能不能挖的在深入些. (1) ...
- mxonline实战9,我要学习功能块,机构详情展示,收藏功能
对应github地址:第9天 一. 实现我要学习功能
- python 对mongodb进行压力测试
最近对mongoDB数据库进行性能分析,需要对数据库进行加压. 加压时,最初采用threading模块写了个多线程程序,测试的效果不理想. 单机读数据库每秒请求数只能达到1000次/s.而开发的jav ...
- 机器学习笔记(五) K-近邻算法
K-近邻算法 (一)定义:如果一个样本在特征空间中的k个最相似的样本中的大多数属于某一个类别,则该样本也属于这个类别. (二)相似的样本,特征之间的值应该是相近的,使用k-近邻算法需要做标准化处理.否 ...
- HDU-1160-FatMouse's Speed(线性DP,LIS)
FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- Scrum Meeting 汇总
Alpha [Alpha]Scrum Meeting 0&1 [Alpha]Scrum Meeting 2 [Alpha]Scrum Meeting 3 [Alpha]Scrum Meetin ...
- 经典DP 洛谷p1880 石子合并
https://www.luogu.org/problemnew/show/P1880 题目 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新 ...
- 【性能测试】:解决loadrunner执行脚本启动慢的问题
解决方法更改.net安装目录中一个配置文件machine.config. 该文件位于.net安装目录下v2.0.50727\CONFIG(如C:\Windows\Microsoft.NET\Frame ...