2010-04-02 65 views
0

我有一个需要在SQL Server数据库表中持久保存的对象列表,其中每个对象都被保存为单个记录。即对象列表导致插入多条记录。.NET |在最少数量的查询中保留多个对象

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

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

回答

2

单存储过程的价值(2008年)参数

这是我们做的(2005)

的权威从厄兰Sommarskog为2005和文章2008

1

您使用SQL Server 2008吗?您可以使用table-valued parameters将一组值(行)传递给单个参数中的命令。与多个XML(2005)或表

0

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

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

0

过去我做了什么,如果对象是可序列化的,并且您的sql server是2005或更高版本,则使用xml Serializable,然后将该对象保存在xml字段中。如果你想打破对象分解成indivual记录,那么你还可以通过在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()); 

所有列表实际上将被翻译为< ArrayOf {}类名>所有其它变量将是个e物业名称

相关问题