程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> Sql2008中使用DataTable作為存儲過程的參數

Sql2008中使用DataTable作為存儲過程的參數

編輯:關於SqlServer
使用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。

  二、測試概述

  測試項目很簡單,就是添加新用戶

  

  三、准備數據

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

  點擊【添加】按鈕時調用存儲過程。測試是完成了,也很簡單,傳遞一個DataTable做參數確實很方便吧,能夠輕松完成原先需要很多編碼的工 作。關於表變量還是有些道道的,如創建時判斷其是否存在的語句,刪除表變量前需要先刪除引用表變量的存儲過程等。一般開發我大多會選擇用臨時表,處理起來 比較方便,表變量可以作為存儲過程參數確實是一個獨特的優勢,希望在SQL Server的未來版本中能夠繼續增強對表變量和臨時表的支持,尤其是早日支持臨時表調試。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved