將DataTable作為存儲過程參數(shù)的用法實例詳解
更新時間:2013年05月23日 18:11:07 作者:
需要向存儲過程中傳遞字符串,今天看了下SQL Server 2008的新特性,發(fā)現(xiàn)有表變量的使用,及其將DataTable作為參數(shù)的用法,下面與大家分享下
最近工作中寫了幾個存儲過程,需要向存儲過程中傳遞字符串,因為SQL Server 2000中沒有內(nèi)置類似于 split 的函數(shù),只好自己處理,將前臺數(shù)據(jù)集中的一列用逗號拆分存到一個List<string>中,再轉(zhuǎn)化為字符串傳給存儲過程,很是麻煩。今天看了下SQL Server 2008的新特性,發(fā)現(xiàn)有表變量的使用,及其將DataTable作為參數(shù)的用法,就嘗試了一下,簡單談?wù)勑牡谩?
示例代碼下載
一、測試環(huán)境
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。
二、測試概述
測試項目很簡單,就是添加新用戶
三、準備數(shù)據(jù)
1、建立數(shù)據(jù)庫、表、類型、存儲過程
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
前臺搭建好表單,后臺主要是一個函數(shù):
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;
}
}
點擊【添加】按鈕時調(diào)用存儲過程。測試是完成了
示例代碼下載
一、測試環(huán)境
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。
二、測試概述
測試項目很簡單,就是添加新用戶

三、準備數(shù)據(jù)
1、建立數(shù)據(jù)庫、表、類型、存儲過程
復(fù)制代碼 代碼如下:
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
復(fù)制代碼 代碼如下:
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
前臺搭建好表單,后臺主要是一個函數(shù):
復(fù)制代碼 代碼如下:
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;
}
}
點擊【添加】按鈕時調(diào)用存儲過程。測試是完成了
您可能感興趣的文章:
- 比較2個datatable內(nèi)容是否相同的方法
- datatable生成excel和excel插入圖片示例詳解
- c#將list類型轉(zhuǎn)換成DataTable方法示例
- 多個jquery.datatable共存,checkbox全選異常的快速解決方法
- DataTables List互相轉(zhuǎn)換的實現(xiàn)類示例
- 使用DataTable.Select 方法時,特殊字符的轉(zhuǎn)義方法分享
- ASP.NET中DataTable與DataSet之間的轉(zhuǎn)換示例
- 多個datatable共存造成多個表格的checkbox都被選中
- datatable行轉(zhuǎn)列示例分享
相關(guān)文章
SQL Server 2008打開輸入sa密碼提示無法登陸數(shù)據(jù)庫的解決方法
與 SQL Server建立連接時出現(xiàn)與網(wǎng)絡(luò)相關(guān)的或特定于實例的錯誤,這篇文章主要介紹了SQL Server 2008打開輸入sa密碼提示無法登陸數(shù)據(jù)庫的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07SQL server 2008不允許保存更改的完美解決辦法(圖解)
我重裝系統(tǒng)后就安裝了SQL Server2008R2,第一次使用時在修改表結(jié)構(gòu)的時候經(jīng)碰到這樣一個警告【不允許保存更改。您所做的更改要求刪除并重新創(chuàng)建以下表.對這樣的錯誤提示怎么解決呢?下面小編通過圖文并茂的形式給大家分享解決辦法2017-01-01SQL Server 2008 阻止保存要求重新創(chuàng)建表的更改問題的設(shè)置方法
不是很理解為什么在2008中會加入阻止保存要求重新創(chuàng)建表的更改這個選項.癥狀表現(xiàn)為修改表結(jié)構(gòu)的時候會"阻止"你.而且我遇到的情況是居然有的時候阻止你,有的時候不阻止你,摸不到頭腦.2012-05-05在與 SQL Server 建立連接時出現(xiàn)與網(wǎng)絡(luò)相關(guān)的或特定于實例的錯誤。未找到或無法訪問服務(wù)器
在與 SQL Server 建立連接時出現(xiàn)與網(wǎng)絡(luò)相關(guān)的或特定于實例的錯誤。未找到或無法訪問服務(wù)器。請驗證實例名稱是否正確并且 SQL Server 已配置為允許遠程連接。 (provider: 命名管道提供程序, error: 40 - 無法打開到 SQL Server 的連接)2015-01-01SQL Server 2008 備份數(shù)據(jù)庫、還原數(shù)據(jù)庫的方法
這篇文章主要介紹了SQL Server 2008 備份數(shù)據(jù)庫、還原數(shù)據(jù)庫的方法,需要的朋友可以參考下2014-08-08SQL Server2008導(dǎo)出數(shù)據(jù)之Excel詳細解析
我覺得數(shù)據(jù)庫的導(dǎo)入和導(dǎo)出很有用,順便做一下總結(jié),以免將來有遺忘。需要的朋友可以過來參考下2013-08-08