2010-04-02 26 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物業名稱

相關問題