天堂向左

我是天堂向左

[C#新手入门 三] 使用DataTable作为存储过程的参数

http://www.cnblogs.com/zhangchenliang/archive/2011/05/19/2050752.html

一、测试环境

1Windows Server 2008 R2 DataCenter

2Visual Studio 2008 Team System With SP1

3SQL Server 2008 Enterprise Edition With SP1

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

二、测试概述

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

三、准备数据

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

 

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

 

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


 

 

 

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

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的未来版本中能够继续增强对表变量和临时表的支持,尤其是早日支持临时表调试:)

阅读更多
个人分类: C#
上一篇[C#新手入门 二] SqlDataAdapter.Update批量数据更新
下一篇[C#新手入门 四] Winform 多线程初步 BackgroundWorker的用法
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭