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 ...
随机推荐
- C#上传文件处理
public class FileHelp : System.Web.UI.Page { /// <summary> /// 保存文件 /// 返回:数组:status[0]:文件名称:s ...
- jdk1.6 支持 tls1.2协议 并忽略身份验证
jdk1.6不支持tls1.2协议,jdk1.8默认支持,比较好的解决方案是升级jdk,但是升级jdk风险极大.不能升级jdk的情况下,可以使用如下方式. 引入依赖 <dependency> ...
- Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option)
今天运行Redis时发生错误,错误信息如下: org.springframework.dao.InvalidDataAccessApiUsageException: MISCONF Redis is ...
- AI 的下一个重大挑战:理解语言的细微差别
简评:人类语言非常博大精妙,同一句话在不同的语境下,就有不同的含义.连人类有时候都不能辨别其中细微的差别,机器能吗?这就是人工智能的下一个巨大挑战:理解语言的细微差别.本文原作者是 Salesforc ...
- 【Quartz】解密properties配置文件中的账号密码
在配置quartz时,为了保密某些信息(特别是账号密码),通常会使用密文.那么在实际使用这些配置信息时,需要进行解密.本文提供一种解密方法如下: (1)假设在properties文件中加密了账号密码 ...
- SUSE Linux Enterprise Server设置IP地址、网关、DNS
说明: ip:202.118.83.247 子网掩码:255.255.255.0 网关:202.118.83.2 dns:8.8.8.8 / 8.8.4.4 1.设置ip $ vi /etc/sysc ...
- L05-Linux部署msmtp+mutt发送邮件
一.前言 首先,得明白发送一封邮件的流程,下面一段理论摘抄自廖雪峰的官网网站https://www.liaoxuefeng.com/article/00137387674890099a71c04005 ...
- GeneXus学习笔记——创建一个知识库 哈哈哈哈!
终于想到写什么东西了(绝对不是因为懒 好吧 信我) 那么进入正题 我们写项目的时候 遇到一些问题啥的 总会听到大佬说:“这有什么难的 说到底不就是简单的增删改查么" 然后我们就会露出 Σ ...
- 利用scrapy-client发布爬虫的远程服务器
一.环境准备 远程服务器必须装有scapyd,我们使用的机器必须有scrapy-client(我这里是windows),并确保这两者正常安装并启动. 二.客户端准备上传 首先进入到爬虫项目的根文件夹: ...
- wireshark 抓包
Wireshark(前称Ethereal)是一个网络数据包分析软件.网络数据包分析软件的功能是截取网络数据包,并尽可能显示出最为详细的网络数据包数据.Wireshark使用WinPCAP作为接口,直接 ...