2010-08-11 126 views
1

我有簡單的DAL,它由一個SalesEnquiry對象,其中包括一個Vehicle對象,它是用來處理傳入的查詢(XML)的List<T>,並把它們寫到數據庫。到現在爲止還挺好。填充母+子對象

但是,我正在編寫另一個應用程序,以進一步處理此數據庫中的數據,所以我想使用這些相同的DAL對象來檢索和操作數據。

而不是返回傳統的記錄集並遍歷它們,手動填充SalesEnquiry/Vehicle對象的每個屬性,我認爲我可以將數據從SQL Server作爲XML返回並對其進行反序列化。我已經使用這種技術來處理傳入的數據。

但是,我不確定是否/如何在SQL Server中構建適當的XML,或者如果我必須分兩個階段來完成。

下面將提取查詢作爲XML:

Select EnquiryID as 'enquiry/enquiryid', 
    EnquiryNo as 'enquiry/enquiryno', 
    CompanyName as 'enquiry/company' 
From Enquiries e 
Where e.EnquiryID = 23 
For XML PATH 

和下面將提取的相關車輛爲XML:

Select VehicleID as 'vehicle/vehicleid', 
    VehicleReg as 'vehicle/vehiclereg' 
From Vehicles v 
Where v.EnquiryID= 23 
For XML PATH 

生成的XML我後:

<?xml version="1.0" encoding="utf-8"?> 
<enquiry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <enquiry_id>123</enquiry_no> 
    <enquiry_no>100004</enquiry_no> 
    <company>MyCompany</company> 
    <enquiry_no>100004</enquiry_no> 
    <vehicles> 
    <vehicle> 
     <vehicle_registration>ABC123</vehicle_registration> 
    </vehicle> 
    <vehicle> 
     <vehicle_registration>XYZ789</vehicle_registration> 
    </vehicle> 
    </vehicles> 
</enquiry> 

我可以在SQL Server中創建它,還是必須在我的DAL中手動執行此操作?

更新:

從Shunty的建議繼,我使用了以下內容:

Select enquiry.EnquiryID as enquiry_id, enquiry.EnquiryNo, enquiry.CompanyName, VehicleID as [vehicle.vehicle_id], VehicleReg as [vehicle.vehicle_registration] 
From Enquiries as enquiry 
inner join Vehicles on Vehicles.EnquiryID = enquiry.EnquiryID 
Where enquiry.EnquiryID = 23 
For XML AUTO, ELEMENTS 

..我可以親近,但我不太有:

<?xml version="1.0" encoding="utf-8"?> 
<enquiry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <enquiry_id>123</enquiry_no> 
    <enquiry_no>100004</enquiry_no> 
    <company>MyCompany</company> 
    <enquiry_no>100004</enquiry_no> 
    <vehicle> 
     <vehicle_registration>ABC123</vehicle_registration> 
    </vehicle> 
    <vehicle> 
     <vehicle_registration>XYZ789</vehicle_registration> 
    </vehicle> 
</enquiry> 

要成功反序列化,我需要我的<vehicle>元素歸入<vehicles>父元素。必須有一種方法來鼓勵SQL創建正確的XML ...

回答

1

另一種使用XML PATH:

SELECT 
    EnquiryID AS enquiry_id, 
    EnquiryNo AS enquiry_no, 
    CompanyName AS company, 
    (
    SELECT 
     VehicleReg AS vehicle_registration 
    FROM Vehicles 
    WHERE EnquiryID = e.EnquiryID 
    FOR XML PATH ('vehicle'), TYPE, ROOT('vehicles') 
    ) 
FROM Enquiries e 
WHERE EnquiryID = 123 
FOR XML PATH ('enquiry'), TYPE 

返回:

<enquiry> 
    <enquiry_id>123</enquiry_id> 
    <enquiry_no>100004</enquiry_no> 
    <company>MyCompany</company> 
    <vehicles> 
    <vehicle> 
     <vehicle_registration>ABC123</vehicle_registration> 
    </vehicle> 
    <vehicle> 
     <vehicle_registration>XYZ789</vehicle_registration> 
    </vehicle> 
    </vehicles> 
</enquiry> 
+0

我可以吻你......但我不會。:) 我看了Root(),但可以弄清楚如何使用它 - 子查詢不會發生在我身上。謝謝。 – CJM 2010-08-11 12:06:04

1

使用標準內連接,然後查看FOR XML子句的AUTO(和ELEMENTS)關鍵字(在MSDN上)。我沒有嘗試過,但它肯定是你想要的。

+0

感謝Shunty - 幾乎沒有,但不完全!看到我上面的更新。任何想法添加最終的父元素? – CJM 2010-08-11 11:00:38

+0

我必須承認它看起來應該是一個嵌套選擇的路徑,但我不能完全把我的頭圍繞它。 – shunty 2010-08-11 12:09:51

+0

我看到我已經被打敗了。謝天謝地 - 我可以看到我整個下午都消失了:-) – shunty 2010-08-11 12:10:45