.NET |在最少数量的查询中保留多个对象

时间:2010-04-02 12:01:50

标签: c# .net sql sql-server database

我有一个需要在SQL Server数据库表中保留的对象列表,其中每个对象都被保存为单个记录。即对象列表导致插入多个记录。

保存对象的简单方法是遍历列表并触发查询/存储过程/等。用于保存该记录。但这会导致多个数据库交互。

有没有办法在较少数量的数据库交互中保留对象列表?

4 个答案:

答案 0 :(得分:2)

具有多个XML(2005)或表值(2008)参数的单个存储过程

这就是我们所做的(2005)

Erland Sommarskog关于20052008

的权威性文章

答案 1 :(得分:1)

您使用的是SQL Server 2008吗?您可以使用table-valued parameters将值集合(行)传递给单个参数中的命令。

答案 2 :(得分:0)

即使不这样做,您也可以将多个SQL staatements放入一个调用(即批处理)。没有什么可以阻止你使用30-60 opr甚至更普通的INSERT语句并立即将它们提交给SQL Server。 SQL字符串可能很大 - 您可以在其中一个语句中包含多个语句。

这里的诀窍是通过往返减少延迟。即呼叫/等待答案对。表值参数以及“批处理”都这样做。

答案 3 :(得分:0)

我以前做过的,如果对象是可序列化的,并且你的sql server是2005或更高版本,则使用xml Serializable,然后将对象保存在xml字段中。如果你想将对象分解为单个记录,那么你仍然可以传入xml并使用xml来查询

例如

DECLARE @X XML 

SET @X ='<ListOfEmployees>
<Employee ID="5">
<Name>Mike</Name>
<Salary>67000</Salary>
</Employee> 
<Employee ID="6">
    <Name>Bob</Name>
    <Salary>40000</Salary>
</Employee> 
</ListOfEmployees>'


SELECT 
T.c.value('Name[1]', 'varchar(50)'), -- The [1] tells Sql get the first Node Name     under the ListOfEmployees/Employee mandatory
T.c.value('Salary[1]','money'),
T.c.value('@ID','int')
FROM @X.nodes('ListOfEmployees/Employee') T(c)

函数节点和值区分大小写

将对象转换为xml

 XmlSerializer x = new XmlSerializer(classObject.GetType());
        MemoryStream stream = new MemoryStream();
        x.Serialize(stream, classObject);

        return Encoding.ASCII.GetString(stream.ToArray());

所有列表实际上将被翻译为&lt; ArrayOf {ClassName}&gt;所有其他变量都是属性名称