2

C#でSQLCommandを使用して、XMLを出力するローカルマシンに対してSQLを実行しています。SQLコードは次のようになります。

"SELECT 
   ' '                          AS 'ItemsCount', 
   ' '                          AS 'Shipping', 
   ' '                          AS 'Fee', 
   ' '                          AS 'ShippingPrc', 
   ' '                          AS 'FeeType', 
   ' '                          AS 'FeeTaxPrc', 
 //many lines of SQL omitted
 FROM   im_item 
   JOIN ps_doc_lin 
     ON im_item.item_no = ps_doc_lin.item_no 
   JOIN  ps_doc_hdr 
     ON ps_doc_hdr.doc_id = ps_doc_lin.doc_id 
   JOIN ar_cust 
   ON ar_cust.cust_no = ps_doc_hdr.cust_no 
 WHERE  ps_doc_hdr.tkt_dt = (SELECT Max(tkt_dt) //I select Max(tkt_dt) here because this program will run right after a customer has completed checkout.  I want to get the most recent ticket (i.e. the ticket just rang up)
                        FROM   ps_doc_hdr) 
 FOR xml path ('Receipt')";

これは機能していますが、最近致命的な欠陥を発見しました。データベースで顧客が複数のアイテムを購入した場合、SQL ServerからのXML出力は、購入したアイテムごとにその顧客の情報が繰り返されたXMLファイルになります。C#でXML出力を解析すると、それを実行できず、出力は複数のルート要素になります。さまざまなテーブルの結合がこれを引き起こしていると思われますが、SQLからさまざまなデータをプルする必要があり、必要なものに到達するためにこれらの結合が必要です。

私はこれに似た何かをしようとしました:

   ' '                          AS 'Total', 
   ' '                          AS 'InvcHdrRcptStatus', 
   ' '                          AS 'InvcHdrRcptType', 
   ' '                          AS 'Cashier', 
   ' '                          AS 'DocDate', 
   ' '                          AS 'InvcNum', 
   (SELECT      ps_doc_lin.sls_rep           AS 'Clerk'
                    FROM PS_DOC_LIN
                    WHERE PS_DOC_LIN.DOC_ID = PS_DOC_HDR.DOC_ID
                    FOR XML PATH ('Item')) as Items, 
   (SELECT     ar_cust.cust_no              AS 'BillToCustNumber', 
   ' '                          AS 'BillToCustCompany', 
   ar_cust.fst_nam              AS 'BillToFName', 
   ar_cust.lst_nam              AS 'BillToLName', 
   ar_cust.salutation           AS 'Customer/Name/Title', 
   ar_cust.adrs_1               AS 'BillToAddr1', 
   ar_cust.adrs_2               AS 'BillToAddr2', 
   ' '                          AS 'BillToAddr3', 
   ar_cust.zip_cod              AS 'BillToZip', 
   ' '                          AS 'BillToInfo1', 
   ' '                          AS 'BillToInfo2', 
   ' '                          AS 'BillToPhone1', 
   ' '                          AS 'BillToPhone2', 
   ar_cust.phone_1              AS 'ShipToPhone1', 
   ar_cust.phone_2              AS 'ShipToPhone2' FROM AR_CUST WHERE AR_CUST.CUST_NO = PS_DOC_HDR.CUST_NO FOR XML PATH ('Customer'), TYPE) as Customers,

JOINを別の選択にネストしました。これは機能しましたが、JSONに変換すると正しくフォーマットされませんでした。出力は次のようになります。

{"Receipt":{ ......//omitted data
 ,"Customer":{"Name: {"title":"Mr."}}

私の意図した出力では、すべてのデータが{"Receipt"内に整理されています。別の{を使用していません。これに似ています:

    "Receipt" : {
    "InvcHdrNotes" : ""
    "Tax" : ""
    "TaxPrc" : ""
    "DiscPrc" : ""
    "Discount" : ""
    "InvcComment1" : ""
    "InvcComment2" : ""
}

「領収書」は、はるかに大きなJSONファイルのサブセクションです。ただし、この欠陥は、取得する必要のある残りのデータにも複製されます(私はそう思います)。これらのデータにもJOINが必要になるためです。JayrockとNewtonsoft.Jsonの両方を使用してみましたが、どちらにもこの問題があります。

私の目標XML出力は次のようになります。

<Receipt>
<InvcHdrNotes> </InvcHdrNotes>
<Tax>Y</Tax>
<Clerk>MGR</Clerk>
<BillToCustNumber>1000</BillToCustNumber>
<BillToCustCompany> </BillToCustCompany>
<BillToFName>Bill</BillToFName>
<BillToLName>Baker</BillToLName>
<Customer>
  <Name>
    <Title>Mr.</Title>
  </Name>
</Customer>
<BillToAddr1>1426 Millstream Parkway</BillToAddr1>
<BillToAddr3> </BillToAddr3>
<BillToZip>38120</BillToZip>
<BillToInfo1> </BillToInfo1>
<BillToInfo2> </BillToInfo2>
<ShipToCustNumber>1000</ShipToCustNumber>
<ShipToCustCompany> </ShipToCustCompany>
<ShipToFName>Bill</ShipToFName>
<ShipToLName>Baker</ShipToLName>
<ShipToTitle>Mr.</ShipToTitle>
<ShipToAddr1>1426 Millstream Parkway</ShipToAddr1>
<ShipToZip>38120</ShipToZip>
</Receipt>

上記のSQLコードでこの出力を取得しますが、同じ情報が繰り返され、その後、前述の例外がスローされます。

これは可能ですか、それとも致命的な設計上の欠陥ですか?それが不可能な場合は、このタスクを完了する方法がわかりません。ありがとうございました。

4

1 に答える 1

0

同じXMLに返される各行をシリアル化しているように見えます。そのため、複数のルート要素が作成されることになります。リスト自体をシリアル化する必要があります。

したがって、最終的には次のようになります。

<Receipts>
  <Receipt>
    ...
  </Receipt>
  <Receipt>
    ...
  </Receipt>
</Receipts>
于 2012-09-15T11:56:59.060 に答える