1

オブジェクトで構成される単純な DAL があります。このオブジェクトには、受信した問い合わせ (XML) を処理して DB に書き込むために使用されるオブジェクトがSalesEnquiry含まれます。ここまでは順調ですね。List<T>Vehicle

ただし、この DB 内のデータをさらに処理する別のアプリを作成しているので、これらの同じ DAL オブジェクトを使用してデータを取得および操作したいと考えています。

従来のレコードセットを返してそれらを反復処理し、SalesEnquiry/Vehicle オブジェクトの各プロパティを手動で入力するのではなく、SQL Server からデータを XML として返して逆シリアル化できると考えました。私はすでにこの手法を使用して、最初に着信データを処理しています。

ただし、SQL Server で適切な XML を構築できるかどうか、またはどのように構築できるか、または 2 段階で構築する必要があるかどうかはわかりません。

以下は、問い合わせを 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 を作成できるようにする方法が必要です...

4

2 に答える 2

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>
于 2010-08-11T11:51:50.630 に答える
1

標準の内部結合を使用してから、FOR XML 句のAUTO (および ELEMENTS) キーワード (MSDN で) を調べます。私はそれを正確に試したことはありませんが、確かにあなたが望むものに見えます.

于 2010-08-11T10:37:22.083 に答える