博主在做毕业设计的时候,需要用到事务处理和多次将数据写入不同的表中,但是 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)的更多相关文章

  1. SQL Server技术问题之存储过程与sql语句的优缺点

    优点: 1. 允许模块化程序设计.2.可维护性高,只需创建存储过程一次并将其存储在数据库中,以后即可在程序中调用该过程任意次.存储过程可独立于程序源代码而单独修改,而不需要更改.测试以及重新部署程序集 ...

  2. sql server 常用的系统存储过程

      系统存储过程 说明 sp_databases 列出服务上的所有数据库 sp_helpdb 报告有关指定数据库或所有数据库的信息 sp_renamedb 更改数据库的名称 sp_tables 返回当 ...

  3. Sql Server 带参数的存储过程执行方法

    Sql Server 带参数的存储过程执行方法 Visual C# 动态操作 SQL Server 数据库实例教程(4):带参数的存储过程执行方法 上一篇文章介绍了带参数的SQL语句执行方法和不带参数 ...

  4. SQL Server数据恢复准备之TRUNCATE TABLE理解

    SQL Server数据恢复准备之TRUNCATE TABLE理解 转自:https://blog.51cto.com/aimax/2142553 易语随风去关注0人评论6717人阅读2018-07- ...

  5. [转] sql server 跨数据库调用存储过程

    A库存储过程: create PROCEDURE [dbo].[spAAAForTest] ( ) =null , ) =null ) AS BEGIN select N'A' AS a , N'B' ...

  6. SQL Server的通用分页存储过程 未使用游标,速度更快!

    经过一个下午的时间,和我一个同事(绝对是高手)的共同努力下,摸索出了以下的思路: 1.确定存储的输入参数: 1)SQL脚本,该参数接收完整的.正确的SQL检索文本,可将原应用中写好的SQL脚本直接传入 ...

  7. sql server 常用的扩展存储过程

    sql server 里面提供了丰富的系统存储过程来辅助我们管理数据库以及开发.今天分享介绍一些常用的数据库扩展存储过程 xp_cmdshell 这个大家都比较熟悉了,使用xp_cmdshell 可以 ...

  8. SQL Server 2008 R2——T-SQL 存储过程 返回表

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  9. MS SQL Server之光标、存储过程和触发器

    光标 通常数据库操作被认为是以数据集为基础的操作,但是光标被用于以记录为单位来进行操作,来获取数据库中的数据的子集.光标一般用于过程化程序里的嵌入的SQL语句. 对光标的定义如下: DECLARE C ...

随机推荐

  1. 【文文殿下】洛谷P2408 不同子串个数

    题目链接https://www.luogu.org/problemnew/show/P2408 SAM裸题,大力求就行了 #include<cstdio> #include<cstr ...

  2. django入门-初窥门径-part1

    尊重作者的劳动,转载请注明作者及原文地址 http://www.cnblogs.com/txwsqk/p/6510917.html 完全翻译自官方文档 https://docs.djangoproje ...

  3. [CISCO] Telete/SSH 之 Port 绑定/端口安全

    [网络] Telete/SSH 之 Port 绑定/端口安全 一.前言 之前写完了网络] DHCP 之 Mac 绑定,CiSCO 交换机配置 SSH 登陆.这次我们再试试能不能挖的在深入些. (1) ...

  4. mxonline实战9,我要学习功能块,机构详情展示,收藏功能

    对应github地址:第9天   一. 实现我要学习功能

  5. python 对mongodb进行压力测试

    最近对mongoDB数据库进行性能分析,需要对数据库进行加压. 加压时,最初采用threading模块写了个多线程程序,测试的效果不理想. 单机读数据库每秒请求数只能达到1000次/s.而开发的jav ...

  6. 机器学习笔记(五) K-近邻算法

    K-近邻算法 (一)定义:如果一个样本在特征空间中的k个最相似的样本中的大多数属于某一个类别,则该样本也属于这个类别. (二)相似的样本,特征之间的值应该是相近的,使用k-近邻算法需要做标准化处理.否 ...

  7. HDU-1160-FatMouse's Speed(线性DP,LIS)

    FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. Scrum Meeting 汇总

    Alpha [Alpha]Scrum Meeting 0&1 [Alpha]Scrum Meeting 2 [Alpha]Scrum Meeting 3 [Alpha]Scrum Meetin ...

  9. 经典DP 洛谷p1880 石子合并

    https://www.luogu.org/problemnew/show/P1880 题目 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新 ...

  10. 【性能测试】:解决loadrunner执行脚本启动慢的问题

    解决方法更改.net安装目录中一个配置文件machine.config. 该文件位于.net安装目录下v2.0.50727\CONFIG(如C:\Windows\Microsoft.NET\Frame ...