65.9K
CodeProject 正在变化。 阅读更多。
Home

SQL Server 2008 表值参数

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.44/5 (11投票s)

2007 年 12 月 23 日

CPOL

1分钟阅读

viewsIcon

96082

downloadIcon

970

使用 SQL Server 2008 表值参数插入多条记录 (VS 2008)。

引言

过去两周,我一直在开发批量数据操作。甚至在此之前,我一直想知道“将值数组传递到 SQL Server 存储过程的最佳方法是什么?” 我找到的一个选项是 OpenXML,我曾在 这里 博客过。

最近我正在尝试使用 Visual Studio 2008 和 SQL Server 2008。 昨晚,我发现 SQL Server 现在支持表值参数,允许我们将数据表作为参数传递给存储过程。 它仍然使用相同的 ADO.NET API。

工作原理

现在我将展示它是如何工作的。为此,我使用了与我在 上一篇帖子 (读取文件夹内容并保存其信息) 中使用的相同场景。 这里,我使用了 SQL Server 2008 November CTPVisual C# 2008 Express edition

首先,创建下面的表

CREATE TABLE FileDetails(
FileName varchar(50) PRIMARY KEY,
CreatedDate varchar(50) ,
Size  decimal(18, 0) )  

然后,我们应该在数据库中声明一个新的 table 用户定义类型

create type FileDetailsType as table
(
    FileName        varchar(50),
    CreatedDate        varchar(50),
    Size       decimal(18,0)
)

然后,创建一个存储过程,该过程获取上述类型的参数,并在单个命令中插入多行。

create procedure InsertFileDetails
(
    @FileDetails FileDetailsType readonly
)

as
insert into  
    FileDetails (FileName, CreatedDate, Size)
        select FileName, CreatedDate, Size
        from  
    @FileDetails; 

要执行此过程,我们可以创建一个数据表并将行添加到其中。 然后将此数据表作为参数传递给数据库。

private static void SaveFileDetail(List<FileInfo> info)
{ 
    Console.WriteLine("**********updating with tablevalued parameters****");
    DataTable dt = preparedatatable();
    foreach (FileInfo file in info)
    {
        DataRow dr = dt.NewRow();
        dr[0] = file.Name;
        dr[1] = file.CreationTime.ToShortDateString();
        dr[2] = (decimal)file.Length;
        dt.Rows.Add(dr);
    }

    using(SqlConnection conn = new SqlConnection("your connection string"))
    {
        SqlCommand cmd = conn.CreateCommand();
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.CommandText = "dbo.InsertFileDetails";
        SqlParameter param = cmd.Parameters.AddWithValue("@FileDetails", dt);
        conn.Open(); 
        cmd.ExecuteNonQuery();
        Console.WriteLine("Completed Updating the database");
    }

现在这很酷,不是吗?

© . All rights reserved.