将DataTable作为存储过程参数的用法实例详解

时间:2024-01-27 14:23:24 

最近工作中写了几个存储过程,需要向存储过程中传递字符串,因为SQL Server 2000中没有内置类似于 split 的函数,只好自己处理,将前台数据集中的一列用逗号拆分存到一个List<string>中,再转化为字符串传给存储过程,很是麻烦。今天看了下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。
二、测试概述
测试项目很简单,就是添加新用户
将DataTable作为存储过程参数的用法实例详解 
三、准备数据
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


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


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;
}
}


点击【添加】按钮时调用存储过程。测试是完成了

标签:DataTable,存储过程,参数
0
投稿

猜你喜欢

  • python数据拟合之scipy.optimize.curve_fit解读

    2021-05-27 01:48:49
  • python队列原理及实现方法示例

    2022-10-08 20:53:09
  • 教你使用Python画圣诞树做浪漫的程序员

    2023-03-19 21:39:02
  • 对python借助百度云API对评论进行观点抽取的方法详解

    2023-12-06 19:42:12
  • Python中通过@classmethod 实现多态的示例

    2021-02-25 06:10:33
  • Python图片验证码降噪和8邻域降噪

    2023-09-16 10:05:49
  • Python读写压缩文件的方法

    2023-06-02 19:37:53
  • PHP用mysql数据库存储session的代码

    2023-09-05 00:44:50
  • 为ckeditor编辑器加上传图片的功能

    2022-08-11 22:17:50
  • 非常不错的[JS]Cookie精通之路第1/2页

    2023-09-04 04:04:34
  • 如何基于Python按行合并两个txt

    2021-03-19 08:24:41
  • python 密码验证(滑块验证)

    2021-01-24 02:32:18
  • Pycharm 操作Django Model的简单运用方法

    2022-05-09 14:07:15
  • django获取from表单multiple-select的value和id的方法

    2021-11-03 13:13:31
  • Vue 2.0 服务端渲染入门介绍

    2023-07-02 16:58:52
  • vue中的ref和$refs的使用

    2024-05-13 09:08:44
  • Python文件操作及内置函数flush原理解析

    2021-07-16 06:43:38
  • PyQt5中QTimer定时器的实例代码

    2021-06-01 07:28:54
  • python中readline判断文件读取结束的方法

    2022-12-14 06:22:51
  • Go 语言入门之Go 计时器介绍

    2024-05-25 15:16:04
  • asp之家 网络编程 m.aspxhome.com