Windows 2003Visual Studio 2008ADO.NETWindows XPXML.NET 3.5SQL Server 2005C# 3.0Visual StudioSQL ServerSQLWindows.NETASP.NETC#
将集合的值插入数据库






3.27/5 (7投票s)
将集合的值插入数据库
引言
本文/代码将帮助需要同时插入多个对象或对象列表并进行单次数据库交互的人员。
背景
当我们需要同时使用单次数据库操作插入对象列表时,我们总是需要这样的功能。这里有一段代码,它使用 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();
}
在上面的扩展方法中,我们调用UserImage
的ToString
方法来生成单个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 日:初始发布