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 ...
随机推荐
- django系列4.2--自定义标签, 自定义过滤器, inclusion_tag, 引入静态文件(css,js等)
项目的目录为 在app中创建templates时,最好要再创建一个app名相同的文件夹,因为项目找文件时从第一个app开始遍历,不同app内的同名文件会有冲突,所以这样处理 一.自定义标签和过滤器 1 ...
- 201621123023《Java程序设计》第12周学习总结
一.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 二.书面作业 本次PTA作业题集多线程 1. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书 ...
- leetcode 72 编辑距离 JAVA
题目: 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 ...
- 实时监测input输入变化 jQuery
$('#production_name').on('input propertychange',function(){ alert('输入一个字弹一回'); });
- Security-OAuth2.0 密码模式之服务端实现
第一步:配置数据库 ,固定创建三张表 ,OAuth2 框架需要默认使用这三张表 我使用的时Mysql,工具为navcat CREATE TABLE `oauth_access_token` ( `to ...
- 多并发编程基础 之进程 Process
原贴 https://www.cnblogs.com/gbq-dog/p/10299663.html 1. 进程的理论知识 1.1 操作系统的背景知识 顾名思义,进程即正在执行的一个过程.进程是对正 ...
- 创建一个简单的maven的web程序
最近学习Hadoop,发现学习要想用hadoop作为后台运行web程序,必须应用maven,所以学习了今天学习了一下maven,然后搭建了一个简单的web程序 首先我使用的是eclipse中自带的ma ...
- Markdown数学公式速查记录
参考: Markdown数学公式语法 markdown最全数学公式速查 行内与独行 行内公式:将公式插入到本行内,符号:$公式内容$,如:$xyz$ 独行公式:将公式插入到新的一行内,并且居中,符号: ...
- 12个值得关注的顶级可视化JS库 涉及图表、动画、时间处理,表格操作
本文是译文,原文是https://da-14.com/blog/top-11...我在原文的基础上加了百度的Echats图表库,这个也是毫不逊色其他图表库的.另外Handsontable电子表格库也是 ...
- Service Discovery protocol(SDP)
locating services provided by Volume 3 , Part C , section 8 2.1sdp client-server architecture 2.2 se ...