使用DataTable作为存储过程的参数

最近工作中写了几个存储过程,需要向存储过程中传递字符串,因为 SQL Server 2000 中没有内置类似于 split 的函数,只好自己处理,将前台数据集中的一列用逗号拆分存到一个 List<string> 中,再转化为字符串传给存储过程,很是麻烦。今天看了下 SQL Server 2008 的新特性,发现有表变量的使用,及其将 DataTable 作为参数的用法,就尝试了一下,简单谈谈心得。

 示例代码下载

 

一、测试环境

1Windows Server 2008 R2 DataCenter

2Visual Studio 2008 Team System With SP1

3SQL Server 2008 Enterprise Edition With SP1

由于是SQL Server 2008新特性,所以只能用2008

 

 二、测试概述

测试项目很简单,就是添加新用户

1.jpg

 

 

三、准备数据

1、建立数据库、表、类型、存储过程

 

ExpandedBlockStart.gif 代码
 1  IF   NOT   EXISTS ( SELECT   *   FROM  dbo.sysobjects  WHERE  id  =   OBJECT_ID ( ' Users ' AND   OBJECTPROPERTY (id, N ' IsUserTable ' =   1 )
 2  BEGIN
 3    CREATE   TABLE  dbo.Users
 4   (
 5    UserID  INT   IDENTITY ( - 1 - 1 NOT   NULL ,
 6    UserName  VARCHAR ( 20 NOT   NULL ,
 7    UserPass  VARCHAR ( 20 NOT   NULL ,
 8    Sex  BIT   NULL ,
 9    Age  SMALLINT   NULL ,
10     CONSTRAINT  PK_Users_UserID  PRIMARY   KEY (UserID)
11   )
12  END
13  IF   NOT   EXISTS ( SELECT   *   FROM  sys.table_types  WHERE  name  =   ' UserTable '   AND  is_user_defined  =   1 )
14  BEGIN
15    CREATE  TYPE UserTable  AS   TABLE
16   (
17    UserName  VARCHAR ( 20 NOT   NULL ,
18    UserPass  VARCHAR ( 20 NOT   NULL ,
19    Sex  BIT   NULL ,
20    Age  SMALLINT   NULL
21   )
22  END
23  GO
24 
ExpandedBlockStart.gif 代码
 1  IF   EXISTS ( SELECT   *   FROM  dbo.sysobjects  WHERE  id  =   OBJECT_ID ( ' sp_InsertSingleUser ' AND   OBJECTPROPERTY (id, N ' IsProcedure ' =   1 )
 2  BEGIN
 3       DROP   PROCEDURE  dbo.sp_InsertSingleUser
 4  END
 5  GO
 6  CREATE   PROCEDURE  dbo.sp_InsertSingleUser
 7  (
 8       @User  UserTable READONLY
 9  )
10  AS
11 
12  SET  XACT_ABORT  ON
13  BEGIN   TRANSACTION
14 
15  INSERT   INTO  dbo.Users(UserName, UserPass, Sex, Age)
16  SELECT  UserName, UserPass, Sex, Age  FROM   @User
17 
18  COMMIT   TRANSACTION
19  SET  XACT_ABORT  OFF
20  GO

前台搭建好表单,后台主要是一个函数:

ExpandedBlockStart.gif 代码
 1       public   void  fnInsertSingleUser(DataTable v_dt)
 2      {
 3           try
 4          {
 5              SqlConnection cn  =   new  SqlConnection(CONN);
 6              SqlCommand cmd  =  cn.CreateCommand();
 7              cmd.CommandType  =  CommandType.StoredProcedure;
 8              cmd.CommandText  =   @" sp_InsertSingleUser " ;
 9              SqlParameter p  =  cmd.Parameters.AddWithValue( " @User " , v_dt);
10 
11              DataSet ds  =   new  DataSet();
12              SqlDataAdapter da  =   new  SqlDataAdapter(cmd);
13              da.Fill(ds);
14          }
15           catch  (Exception ex)
16          {
17               throw  ex;
18          }
19      }

  点击【添加】按钮时调用存储过程。测试是完成了,也很简单,传递一个DataTable做参数确实很方便吧,能够轻松完成原先需要很多编码的工 作。关于表变量还是有些道道的,如创建时判断其是否存在的语句,删除表变量前需要先删除引用表变量的存储过程等。一般开发我大多会选择用临时表,处理起来 比较方便,表变量可以作为存储过程参数确实是一个独特的优势,希望在SQL Server的未来版本中能够继续增强对表变量和临时表的支持,尤其是早日支持临时表调试:)

转载于:https://www.cnblogs.com/zhangchenliang/archive/2011/05/19/2050752.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值