C# 从SQL Server中提取XML数据以在C中解析为JSON格式问题
我在C中使用SQLCommand对将输出XML的本地计算机运行SQL。SQL代码如下所示:C# 从SQL Server中提取XML数据以在C中解析为JSON格式问题,c#,sql,xml,json,C#,Sql,Xml,Json,我在C中使用SQLCommand对将输出XML的本地计算机运行SQL。SQL代码如下所示: "SELECT ' ' AS 'ItemsCount', ' ' AS 'Shipping', ' ' AS 'Fee', ' ' AS 'ShippingPrc',
"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')";
{"Receipt":{ ......//omitted data
,"Customer":{"Name: {"title":"Mr."}}
这一直有效,但我最近发现了一个致命的缺陷。如果客户在数据库中购买了多个项目,那么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,
"Receipt" : {
"InvcHdrNotes" : ""
"Tax" : ""
"TaxPrc" : ""
"DiscPrc" : ""
"Discount" : ""
"InvcComment1" : ""
"InvcComment2" : ""
}
我将联接嵌套到另一个select中。虽然这确实有效,但在转换为JSON时格式不正确。输出如下所示:
"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')";
{"Receipt":{ ......//omitted data
,"Customer":{"Name: {"title":"Mr."}}
我的预期输出将在{receive:中组织所有数据,而不使用另一个{。类似于此:
' ' 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,
"Receipt" : {
"InvcHdrNotes" : ""
"Tax" : ""
"TaxPrc" : ""
"DiscPrc" : ""
"Discount" : ""
"InvcComment1" : ""
"InvcComment2" : ""
}
收据是一个大得多的JSON文件的一个子部分。但是,我认为对于我需要获取的其余数据,该漏洞将被复制,因为我也需要对这些数据进行连接。我尝试使用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代码得到这个输出,但是相同的信息在之后重复,这引发了我提到的异常
这是可能的还是致命的设计缺陷?如果不可能,我不确定如何完成此任务。谢谢。看起来您正在序列化返回到同一XML的每一行-因此您将得到多个根元素。您需要序列化列表本身 所以你最终会得到:
<Receipts>
<Receipt>
...
</Receipt>
<Receipt>
...
</Receipt>
</Receipts>
看起来您正在序列化返回到同一XML的每一行-因此您将得到多个根元素。您需要序列化列表本身 所以你最终会得到:
<Receipts>
<Receipt>
...
</Receipt>
<Receipt>
...
</Receipt>
</Receipts>
只是一个建议:您似乎在询问XML到JSON的转换。这与SQL无关!删除SQL并添加将XML转换为JSON的代码如何?这确实与SQL有关。请重新阅读我的问题,我正在使用Jayrock和Newtonsoft.JSON对众所周知且可用的两种格式进行序列化。问题是:与XML->JSON无关,它是SQL代码的XML输出,具有多个根元素,因此在加载doc.LoadXMLxml时引发XmlException。更不用说格式不正确的XML意味着格式不正确的JSON,GIGO。如果问题出在SQL Server生成的XML中。发布您希望查询返回的内容,去掉JSON的东西。你甚至可以举一个例子,如果你有多个根元素,为什么不使用基本的字符串操作和文件IO例程将它们封装在一个根元素中呢?我已经添加了我想要查询返回的XML。查询当前将返回该XML,但重复相同数量的数据与客户购买的商品数量相同倍,使用XMLDocument类处理时会引发多个根元素异常。只是一个建议:您似乎在询问XML到JSON的转换。这与SQL无关!删除SQL并添加将XML转换为JSON的代码如何?这必须要做的是:重新阅读我的问题,我正在使用Jayrock和Newtonsoft.Json来序列化这两个众所周知且可用的文件。问题不在于XML->Json,而是SQL代码的XML输出具有多个根元素,从而在加载doc.LoadXMLxml时引发XmlException。更不用说格式不正确了XML是指格式不正确的JSON,GIGO。如果问题出在SQL Server生成的XML中。发布您希望查询返回的内容,并删除JSON内容。您甚至可以设置一个示例,说明如果您有多个根元素,为什么不使用基本的字符串操作和文件IO例程将它们包装在一个根元素中?我知道我添加了我希望查询返回的预期XML。该查询当前将返回该XML,但重复次数与客户购买的商品数量相同,使用XMLDocument类处理时会引发多个根元素异常。