博主在做毕业设计的时候,需要用到事务处理和多次将数据写入不同的表中,但是 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. 弹性盒子模型display:flex

    1.div上下左右居中 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  2. leecode刷题(19)-- 最长公共前缀

    leecode刷题(19)-- 最长公共前缀 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: [&quo ...

  3. php请求远程url内容方法

    php请求远程url内容有两个方法fopen/file_get_contents和curl. 1,fopen/file_get_contents与curl的差异 (1)fopen /file_get_ ...

  4. SpringMVC中重定向传参数的方法

    在spring的一个controller中要把参数传到页面,只要配置视图解析器,把参数添加到Model中,在页面用el表达式就可以取到.但是,这样使用的是forward方式,浏览器的地址栏是不变的,如 ...

  5. linux之getenv putenv setenv和unsetenv详解

    1.getenv函数 头文件:#include<stdlib.h> 函数原型: char * getenv(const char* name); 函数说明:getenv()用来取得参数na ...

  6. 编程开发之--java多线程学习总结(6)

    5.测试 package com.lfy.ThreadsSynchronize; public class Test { public static void main(String[] args) ...

  7. VUE源代码调试方法

    前两条出自: https://link.zhihu.com/?target=http%3A//www.orzzone.com/vuejs-project-debug.html https://www. ...

  8. 【性能测试】:LR中解决接口请求中包含中文字符,服务器不识别的问题

    在LR中,直接写的接口请求,如果请求字段包含中文字段,服务器会不识别,这个时候就要用到lr_convert_string_encoding这个函数: 具体用法: lr_convert_string_e ...

  9. shell (三) 文件压缩

    查看压缩文件 #tar tvf tar.tar.gz -rw-r--r-- root/root 290 2019-03-22 14:38 README.md -rw-r--r-- root/root ...

  10. WebStorm 快键键

    ctrl+/ 单行注释ctrl+shift+/ 块注释ctrl+shift+ +/- 展开/折叠ctrl+alt+L 格式化代码ctrl+shift+ up/down 上下移动句子 Alt+回车 导入 ...