將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、建立數據庫、表、類型、存儲過程

 

複製代碼
複製代碼
代碼
 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-1NOT NULL,
 6   UserName VARCHAR(20NOT NULL,
 7   UserPass VARCHAR(20NOT 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(20NOT NULL,
18   UserPass VARCHAR(20NOT NULL,
19   Sex BIT NULL,
20   Age SMALLINT NULL
21  )
22 END
23 GO
24 
複製代碼
複製代碼
複製代碼
複製代碼
代碼
 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
複製代碼
複製代碼

前臺搭建好表單,後臺主要是一個函數:

代碼
 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     }

  點擊【添加】按鈕時調用存儲過程。測試是完成了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章