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

将集合的值插入数据库

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.27/5 (7投票s)

2008年8月8日

CPOL

2分钟阅读

viewsIcon

34023

downloadIcon

154

将集合的值插入数据库

引言

本文/代码将帮助需要同时插入多个对象或对象列表并进行单次数据库交互的人员。

背景

当我们需要同时使用单次数据库操作插入对象列表时,我们总是需要这样的功能。这里有一段代码,它使用 C# 3.0 功能,扩展方法,实现了相同的功能。

Using the Code

此代码包含通过重写ToString方法创建 XML 的逻辑。

public override string ToString()
{
    return string.Format("<UserImage HashCode=\"{0}\" Id=\"{1}\" 
	UserId=\"{2}\" OriginalName=\"{3}\" StorageName=\"{4}\" />",
    this.GetHashCode(), this.Id, this.UserId, this.OriginalName, this.StorageName);
}        

此方法将生成UserImage类的 XML 表示。UserImage类包含存储图像所需的基本属性。您可以根据需要更改它,并且不要忘记更改ToString方法。

现在,您有一个UserImage集合,需要为集合中所有UserImage生成 XML。

List<UserImage> imageList = new List<UserImage>();
//Add some images
imageList.Add(new UserImage(1, 786, "Test1.jpg", @"C:\Temp\User_786_1.jpg"));
imageList.Add(new UserImage(2, 786, "Test2.jpg", @"C:\Temp\User_786_2.jpg"));
imageList.Add(new UserImage(3, 786, "Test3.jpg", @"C:\Temp\User_786_3.jpg"));
imageList.Add(new UserImage(4, 786, "Test4.jpg", @"C:\Temp\User_786_4.jpg"));
imageList.Add(new UserImage(5, 786, "Test5.jpg", @"C:\Temp\User_786_5.jpg"));
imageList.Add(new UserImage(6, 786, "Test6.jpg", @"C:\Temp\User_786_6.jpg"));

imageList已准备就绪,我们也有ToString方法,它提供UserImage的XML。现在我们要做什么……我们需要遍历集合并获取imageList中每个对象的XML。为此,我们使用扩展方法,这里有ToXMLString扩展方法,它适用于List<UserImage>

public static string ToXMLString(this List<UserImage> list)
{
    StringBuilder sb = new StringBuilder();
    sb.Append("<UserImages>");

    foreach (UserImage image in list)
    {
        sb.Append    (image.ToString());
    }

    sb.Append("</UserImages>");
    return sb.ToString();
}

在上面的扩展方法中,我们调用UserImageToString方法来生成单个XMLstring,然后Append父标记。

所以最后,你可以得到如下所示的 XML

<UserImages>
    <UserImage HashCode="17798814" Id="1" UserId="786" 
	OriginalName="Test1.jpg" StorageName="C:\Temp\User_786_1.jpg" /> 
    <UserImage HashCode="38230786" Id="2" UserId="786" 
	OriginalName="Test2.jpg" StorageName="C:\Temp\User_786_2.jpg" /> 
    <UserImage HashCode="64649019" Id="3" UserId="786" 
	OriginalName="Test3.jpg" StorageName="C:\Temp\User_786_3.jpg" /> 
    <UserImage HashCode="15452120" Id="4" UserId="786" 
	OriginalName="Test4.jpg" StorageName="C:\Temp\User_786_4.jpg" /> 
    <UserImage HashCode="56059077" Id="5" UserId="786" 
	OriginalName="Test5.jpg" StorageName="C:\Temp\User_786_5.jpg" /> 
    <UserImage HashCode="36389945" Id="6" UserId="786" 
	OriginalName="Test6.jpg" StorageName="C:\Temp\User_786_6.jpg" /> 
</UserImages>

现在对于 SQL 部分 - 我们需要将string传递给存储过程,然后在过程中,我们只需要从 XML 节点中选择可以直接插入表中的值。

好了

INSERT INTO @UserImageTable 

SELECT 
    UserImage.value ('@Id[1]', 'VARCHAR(10)') as Id,
    UserImage.value ('@UserId[1]', 'VARCHAR(10)') as UserId,
    UserImage.value ('@OriginalName[1]', 'VARCHAR(100)') as OriginalName,
    UserImage.value ('@StorageName[1]', 'VARCHAR(100)') as StorageName
FROM
@UserImages.nodes('/UserImages/UserImage') v(UserImage)

@UserImageTable是临时表。

DECLARE @UserImageTable AS TABLE
(
    Id BIGINT,
    UserId BIGINT,
    OriginalName VARCHAR(100),
    StorageName VARCHAR(100)
)

关注点

好消息是扩展方法使我们可以自由地编写任何给定类的扩展。此外,XML 是 SQL Server 2005 的重要组成部分。但是,XML 数据类型的限制可以在这里找到。

历史

  • 2008 年 8 月 7 日:初始发布
© . All rights reserved.