将DataTable作为存储过程参数的用法实例详解

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

一、测试环境


1、Windows Server 2008 R2 DataCenter
2、Visual Studio 2008 Team System With SP1
3、sql Server 2008 Enterprise Edition With SP1
由于是sql Server 2008新特性,所以只能用2008。

二、测试概述


测试项目很简单,就是添加新用户
@H_403_13@<IMG src="https://files.jb51.cc/file_images/article/201305/2013523180716610.jpg?201342318750"&gt;

三、准备数据


1、建立数据库、表、类型、存储过程
<div class="codetitle"><a style="CURSOR: pointer" data="16090" class="copybut" id="copybut16090" onclick="doCopy('code16090')"> 代码如下:
<div class="codebody" id="code16090">
IF NOT EXISTS(SELECT FROM dbo.sysobjects WHERE id = OBJECT_ID('Users') AND OBJECTPROPERTY(id,N'IsUserTable') = 1)
BEGIN
CREATE TABLE dbo.Users
(
UserID INT IDENTITY(-1,-1) NOT NULL,
UserName VARCHAR(20) NOT NULL,
UserPass VARCHAR(20) NOT NULL,
Sex BIT NULL,
Age SMALLINT NULL,
CONSTRAINT PK_Users_UserID PRIMARY KEY(UserID)
)
END
IF NOT EXISTS(SELECT
FROM sys.table_types WHERE name = 'UserTable' AND is_userdefined = 1)
BEGIN
CREATE TYPE UserTable AS TABLE
(
UserName VARCHAR(20) NOT NULL,
Age SMALLINT NULL
)
END
GO

<div class="codetitle">@L
404_2@ 代码如下:
<div class="codebody" id="code7804">
IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID('sp_InsertSingleUser') AND OBJECTPROPERTY(id,N'IsProcedure') = 1)
BEGIN
DROP PROCEDURE dbo.sp_InsertSingleUser
END
GO
CREATE PROCEDURE dbo.sp_InsertSingleUser
(
@User UserTable READONLY
)
AS
SET XACT_ABORT ON
BEGIN TRANSACTION
INSERT INTO dbo.Users(UserName,UserPass,Sex,Age)
SELECT UserName,Age FROM @User
COMMIT TRANSACTION
SET XACT_ABORT OFF
GO

前台搭建好表单,后台主要是一个函数
<div class="codetitle"><a style="CURSOR: pointer" data="85777" class="copybut" id="copybut85777" onclick="doCopy('code85777')"> 代码如下:
<div class="codebody" id="code85777">
public void fnInsertSingleUser(DataTable v_dt)
{
try
{
sqlConnection cn = new sqlConnection(CONN);
sqlCommand cmd = cn.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = @"sp_InsertSingleUser";
sqlParameter p = cmd.Parameters.AddWithValue("@User",v_dt);
10
DataSet ds = new DataSet();
sqlDataAdapter da = new sqlDataAdapter(cmd);
da.Fill(ds);
}
catch (Exception ex)
{
throw ex;
}
}

点击【添加】按钮时调用存储过程。测试是完成了

DataTable参数参数参数存储过程

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03