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,如下:

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

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

     

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

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

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

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

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

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值