博主在做毕业设计的时候,需要用到事务处理和多次将数据写入不同的表中,但是 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. python网络编程--线程的方法,线程池

    一.线程的其他方法(Thread其他属性和方法) ident() 获取线程id Thread实例对象的方法 isAlive() 设置线程名 getName() 返回线程名 setName() 设置线程 ...

  2. Linux nl --让输出的文件内容自动加上行号

    nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...

  3. select子句排列顺序与聚集函数

    selcet   要返回的列或表达式 from   从中检索数据的表 where    行级过滤 group by 分组说明 having 组级过滤 order by  输出排列顺序   ASC正序排 ...

  4. vscode 本地调试nodejs

    1.首先通过node-inspect插件可以debug   nodejs ,先起nodejs服务,再启用node-inpector服务 安装调试器 npm install -g node-inspec ...

  5. js中的promise详解

    一 概述   Promise是异步编程的一种解决方案,可以替代传统的解决方案--回调函数和事件.ES6统一了用法,并原生提供了Promise对象.作为对象,Promise有一下两个特点: (1)对象的 ...

  6. 工程手机设置apn

    http://android.stackexchange.com/questions/117125/how-do-i-add-an-apn-via-adb xiaomi3 su mount permi ...

  7. 线段树+单调栈+前缀和--2019icpc南昌网络赛I

    线段树+单调栈+前缀和--2019icpc南昌网络赛I Alice has a magic array. She suggests that the value of a interval is eq ...

  8. json对象和数组

    Json数据就是格式化的字符串.c#中如果做为参数调用,类型就是string.1.Json数组 方括号[{ "firstName":"John" , " ...

  9. Mac拷贝/复制文件夹路径快捷键

    快捷键:Option+Command+C 显示路径在Finder: defaults write com.apple.finder _FXShowPosixPathInTitle -bool YES ...

  10. SASS的安装和转换为CSS的方法

    http://www.cnblogs.com/52css/archive/2012/08/19/sass-how-to-install-and-use.html SASS的安装方法: 1.先安装Rub ...