广

MSSQL

  • MYSQL
  • MSSQL
  • Redis
  • MongoDB
  • oracle数据库
  • 数据管理

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

    2018-04-25 21:46:43 次阅读 稿源:互联网
    零七网广告
    全网推广平台,软文发布
    最近工作中写了几个存储过程,需要向存储过程中传递字符串,因为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。
    二、测试概述
    测试项目很简单,就是添加新用户
     
    三、准备数据
    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;
    }
    }

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

    零七网部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与零七网进行文章共享合作。

    零七网广告
    零七网广告
    零七网广告
    零七网广告