• Sql2008中使用DataTable作为存储过程的参数


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

  • 相关阅读:
    Web项目中JSP页面的一种调试方法与出现的问题 -- SpringMVC架构测试
    Web项目中用模板Jsp页面引入所有静态样式脚本文件(js,css等)
    setInterval()、clearInterval()、setTimeout()和clearTimeout()js计数器方法
    另类的package-info.java文件探讨
    myeclipse10 如何把代码预览的窗口去掉
    phpMyAdmin中mysql的创建数据库时的编码的问题
    Jquery 中 $('obj').attr('checked',true)失效的几种解决方案
    监听<input/>标签行为的方法总结
    新花生壳+tomcat(内网映射,无需设置路由器)建站攻略
    Hibernate学习笔记(一):mycelipse建立项目流程(未完成)
  • 原文地址:https://www.cnblogs.com/zhoulove/p/3699692.html
Copyright © 2020-2023  润新知