C#下SQL Server 2008表类型参数传递

开发 后端
本文通过ADO.Net在C#下演示SQL Server 2008的新功能。

在学习SQL Server 2008的过程中,突然发现SQL Server支持自定义表类型,我们可以轻松的将一个SQL Server 2008表类型作为参数传递给存储过程。

我们通过ADO.Net在C#下演示这项SQL Server 2008的新功能。

首先,我们在SQL Server 2008下创建一个示例数据库名为Test,再在该数据库下创建一个名为User的表,结构如下:

在该数据库下创建一个名为User的表 

再在Test数据库下创建一个自定义表类型,取名UserDetailType,如下:

CREATE TYPE [dbo].[UserDetailsType] AS TABLE(  
    [ID] [varchar](50) NULL,  
    [Name] [varchar](50) NULL,  
    [Sex] [varchar](50) NULL,  
    [Age] [decimal](18, 0) NULL  
)   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

然后,创建一个存储过程,取名InsertUserInfo,如下:

CREATE PROCEDURE [dbo].[InsertUserInfo] @UserInfo  [UserDetailsType] readonly 
AS  
BEGIN  
    insert into [User] ([ID], [Name], [Sex], [Age])  
    select [ID], [Name], [Sex], [Age]  
    from @UserInfo;  
END  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

创建一个存储过程,取名InsertUserInfo 

启动Visual Studio 2008,创建一个默认的窗体应用程序后,我们需要先在内存中创建一个数据库表DataTable的实例,如下:

private static DataTable PrepareDatatable()  
{  
    DataTable dt = new DataTable("dt");  
    DataColumn[] dtc = new DataColumn[4];  
    dtc[0] = new DataColumn("ID", System.Type.GetType("System.String"));  
    dtc[1] = new DataColumn("Name", System.Type.GetType("System.String"));  
    dtc[2] = new DataColumn("Sex", System.Type.GetType("System.String"));  
    dtc[3] = new DataColumn("Age", System.Type.GetType("System.Decimal"));  
    dt.Columns.AddRange(dtc);  
    return dt;  
}  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

然后,通过SqlCommand执行刚才我们创建的Test数据库存储过程InsertUserInfo,并传递我们在内存中创建的DataTable的实例,如下:

private static void SaveUserInfoDetails()  
       {  
           DataTable dt = PrepareDatatable();  
           for (int i=0;i< =5;i++)  
           {  
               DataRow dr = dt.NewRow();  
               dr[0] = i.ToString();  
               dr[1] = "Name" + i.ToString();  
               dr[2] = "男";  
               dr[3] = (i*10).ToString();  
               dt.Rows.Add(dr);  
           }  
           using (SqlConnection conn = new SqlConnection("server=Rithia;database=Test;integrated security=SSPI"))  
           {  
               SqlCommand cmd = conn.CreateCommand();  
               cmd.CommandType = System.Data.CommandType.StoredProcedure;  
               cmd.CommandText = "dbo.InsertUserInfo";  
               SqlParameter param = cmd.Parameters.AddWithValue("@UserInfo", dt);  
               conn.Open();  
               cmd.ExecuteNonQuery();  
           }  
       }   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

通过SqlCommand执行刚才我们创建的Test数据库存储过程InsertUserInfo 

通过上面的示例,我们可以在程序客户端先创建好要传递的表类型数据,然后传递给存储过程,而存储过程则将SQL Server 2008表类型参数中的记录一次性的添加到了数据库实体表中,这种操作在需要传递给存储过程数组形式的参数时非常非常方便。

该示例在Visual Studio 2008 SP1 + SQL Server 2008 +Windows XP SP3 下编译调试通过。

这样,就在C#下实现了SQL Server 2008表类型参数传递。

【编辑推荐】

  1. C# Thread类的应 用
  2. C#线程:BeginInvoke和EndInvoke方法
  3. 学习C#:Attribute与Property
  4. C#编码标准66条
  5. C#委托事件及自定义事件的处理
责任编辑:book05 来源: csdn
相关推荐

2011-09-01 16:01:44

C#SQL Server 表类型参数传递

2009-08-27 17:47:18

C#匿名方法作为参数传

2009-08-28 15:57:56

C#线程传递参数

2009-08-24 15:41:50

C#连接SQL Ser

2009-08-06 18:15:13

C# SQL Serv

2009-08-24 14:51:25

C# 泛型泛型类型

2009-08-19 15:59:24

C#参数类型

2009-09-07 03:23:40

C# Main方法

2010-12-06 09:26:23

SQL Server

2009-08-20 09:52:31

C#参数类型

2011-02-21 13:06:34

SQL Servr 2

2010-09-13 10:21:26

sql server2

2012-02-21 14:04:15

Java

2009-08-17 18:30:29

C# SQL Serv

2009-08-24 15:02:05

C# 类型

2009-08-17 13:26:20

C#调用Windows

2011-02-21 13:06:42

Microsoft S

2010-09-13 09:58:17

SQL Server2

2009-04-16 17:55:55

SQL Server 空间数据.NET

2009-09-04 11:00:13

通过C#引用传递
点赞
收藏

51CTO技术栈公众号