http://www.cnblogs.com/zhangchenliang/archive/2011/05/19/2050752.html
一、测试环境
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。
二、测试概述
测试项目很简单,就是添加新用户
![](//pubimage.360doc.com/wz/default.gif)
三、准备数据
1、建立数据库、表、类型、存储过程
- <span style="font-size:14px;">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_user_defined = 1)
- BEGIN
- CREATE TYPE UserTable AS TABLE
- (
- UserName VARCHAR(20) NOT NULL,
- UserPass VARCHAR(20) NOT NULL,
- Sex BIT NULL,
- Age SMALLINT NULL
- )
- END
- GO</span>
- <span style="font-size:14px;">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, UserPass, Sex, Age FROM @User
-
- COMMIT TRANSACTION
- SET XACT_ABORT OFF
- GO</span>
前台搭建好表单,后台主要是一个函数:
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的未来版本中能够继续增强对表变量和临时表的支持,尤其是早日支持临时表调试:)