2010-04-19 2 views
2

다음 코드를 사용하여 xml 열의 sql 데이터베이스에 데이터 집합을 저장했습니다.Dataset.ReadXml() - 주어진 인코딩의 문자가 잘못되었습니다

XmlDataDocument dd = new XmlDataDocument(dataset); 

및 SQL 매개 변수로이 XML 문서를 전달하여

param.value = new XmlNodeReader(dd); 

내가

using (SqlConnection con = new SqlConnection("Server=#####;Initial Catalog=#####;User ID=####;Pwd=########")) 
     { 
      using (SqlCommand com = new SqlCommand("select * from dbo.tbl_#####", con)) 
      { 
       using (SqlDataAdapter ada = new SqlDataAdapter(com)) 
       { 
        ada.Fill(dt); 
        MemoryStream ms = new MemoryStream(); 
        object contractXML1 = dt.Rows[0]["SCOXML1"]; 
        System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 
        bf.Serialize(ms, contractXML1); 
        ms.Seek(0, SeekOrigin.Begin); 
        ds.ReadXml(ms); 
       } 
      } 
     } 
을 다음과 같이 다시 읽으려고
<NewDataSet><SubContractChangeOrders><AGCol>1</AGCol><SCO_x0020_Number>001</SCO_x0020_Number><Contract_x0020_Number>006</Contract_x0020_Number><ContractID>30</ContractID><ChangeOrderID>211</ChangeOrderID><Amount>0.0000</Amount><Udf_CostReimbursableFlag>false</Udf_CostReimbursableFlag><Udf_CustomerCode /><Udf_SubChangeOrderStatus /></SubContractChangeOrders><SubContractChangeOrders><AGCol>2</AGCol><SCO_x0020_Number>002</SCO_x0020_Number><Contract_x0020_Number>006</Contract_x0020_Number><ContractID>30</ContractID><ChangeOrderID>212</ChangeOrderID><Amount>0.0000</Amount><Udf_CostReimbursableFlag>false</Udf_CostReimbursableFlag></SubContractChangeOrders><SubContractChangeOrders><AGCol>3</AGCol><SCO_x0020_Number>001</SCO_x0020_Number><Contract_x0020_Number>111</Contract_x0020_Number><ContractID>87</ContractID><ChangeOrderID>12</ChangeOrderID><Amount>300.0000</Amount></SubContractChangeOrders><SubContractChangeOrders><AGCol>4</AGCol><SCO_x0020_Number>001</SCO_x0020_Number><Contract_x0020_Number>222</Contract_x0020_Number><ContractID>80</ContractID><ChangeOrderID>6</ChangeOrderID><Amount>100.0000</Amount></SubContractChangeOrders><SubContractChangeOrders><AGCol>5</AGCol><SCO_x0020_Number>001</SCO_x0020_Number><Contract_x0020_Number>777</Contract_x0020_Number><ContractID>79</ContractID><ChangeOrderID>5</ChangeOrderID><Amount>200.0000</Amount></SubContractChangeOrders><SubContractChangeOrders><AGCol>6</AGCol><SCO_x0020_Number>001</SCO_x0020_Number><Contract_x0020_Number>786</Contract_x0020_Number><ContractID>77</ContractID><ChangeOrderID>3</ChangeOrderID><Amount>100.0000</Amount></SubContractChangeOrders><SubContractChangeOrders><AGCol>7</AGCol><SCO_x0020_Number>001</SCO_x0020_Number><Contract_x0020_Number>787</Contract_x0020_Number><ContractID>78</ContractID><ChangeOrderID>4</ChangeOrderID><Amount>500.0000</Amount></SubContractChangeOrders><SubContractChangeOrders><AGCol>8</AGCol><SCO_x0020_Number>001</SCO_x0020_Number><Contract_x0020_Number>Con 009</Contract_x0020_Number><ContractID>219</ContractID><ChangeOrderID>78</ChangeOrderID><Amount>9000.0000</Amount></SubContractChangeOrders><SubContractChangeOrders><AGCol>9</AGCol><SCO_x0020_Number>001</SCO_x0020_Number><Contract_x0020_Number>Con 010</Contract_x0020_Number><ContractID>220</ContractID><ChangeOrderID>79</ChangeOrderID><Amount>13000.0000</Amount></SubContractChangeOrders><SubContractChangeOrders><AGCol>10</AGCol><SCO_x0020_Number>001</SCO_x0020_Number><Contract_x0020_Number>Con 012</Contract_x0020_Number><ContractID>222</ContractID><ChangeOrderID>83</ChangeOrderID><Amount>2300.0000</Amount></SubContractChangeOrders><SubContractChangeOrders><AGCol>11</AGCol><SCO_x0020_Number>001</SCO_x0020_Number><Contract_x0020_Number>Con 020</Contract_x0020_Number><ContractID>226</ContractID><ChangeOrderID>86</ChangeOrderID><Amount>5400.0000</Amount></SubContractChangeOrders><SubContractChangeOrders><AGCol>12</AGCol><SCO_x0020_Number>001</SCO_x0020_Number><Contract_x0020_Number>Con 021</Contract_x0020_Number><ContractID>227</ContractID><ChangeOrderID>87</ChangeOrderID><Amount>2300.0000</Amount></SubContractChangeOrders><SubContractChangeOrders><AGCol>13</AGCol><SCO_x0020_Number>001</SCO_x0020_Number><Contract_x0020_Number>Con001</Contract_x0020_Number><ContractID>208</ContractID><ChangeOrderID>72</ChangeOrderID><Amount>3000.0000</Amount></SubContractChangeOrders><SubContractChangeOrders><AGCol>14</AGCol><SCO_x0020_Number>001</SCO_x0020_Number><Contract_x0020_Number>Con002</Contract_x0020_Number><ContractID>209</ContractID><ChangeOrderID>73</ChangeOrderID><Amount>400.0000</Amount></SubContractChangeOrders><SubContractChangeOrders><AGCol>15</AGCol><SCO_x0020_Number>001</SCO_x0020_Number><Contract_x0020_Number>Con003</Contract_x0020_Number><ContractID>210</ContractID><ChangeOrderID>74</ChangeOrderID><Amount>6000.0000</Amount></SubContractChangeOrders><SubContractChangeOrders><AGCol>16</AGCol><SCO_x0020_Number>001</SCO_x0020_Number><Contract_x0020_Number>Con004</Contract_x0020_Number><ContractID>211</ContractID><ChangeOrderID>75</ChangeOrderID><Amount>9000.0000</Amount></SubContractChangeOrders><SubContractChangeOrders><AGCol>17</AGCol><SCO_x0020_Number>001</SCO_x0020_Number><Contract_x0020_Number>Con005</Contract_x0020_Number><ContractID>213</ContractID><ChangeOrderID>76</ChangeOrderID><Amount>17000.0000</Amount></SubContractChangeOrders><SubContractChangeOrders><AGCol>18</AGCol><SCO_x0020_Number>001</SCO_x0020_Number><Contract_x0020_Number>Cont001</Contract_x0020_Number><ContractID>228</ContractID><ChangeOrderID>89</ChangeOrderID><Amount>2000.0000</Amount></SubContractChangeOrders><SubContractChangeOrders><AGCol>19</AGCol><SCO_x0020_Number>001</SCO_x0020_Number><Contract_x0020_Number>PUR001</Contract_x0020_Number><ContractID>229</ContractID><ChangeOrderID>88</ChangeOrderID><Amount>1000.0000</Amount></SubContractChangeOrders><SubContractChangeOrders><AGCol>20</AGCol><SCO_x0020_Number>001</SCO_x0020_Number><Contract_x0020_Number>PUR002</Contract_x0020_Number><ContractID>230</ContractID><ChangeOrderID>90</ChangeOrderID><Amount>3000.0000</Amount></SubContractChangeOrders><SubContractChangeOrders><AGCol>21</AGCol><SCO_x0020_Number>001</SCO_x0020_Number><Contract_x0020_Number>SC-002</Contract_x0020_Number><ContractID>2</ContractID><ChangeOrderID>7</ChangeOrderID><Amount>200.0000</Amount></SubContractChangeOrders><SubContractChangeOrders><AGCol>22</AGCol><SCO_x0020_Number>001</SCO_x0020_Number><Contract_x0020_Number>SC-004</Contract_x0020_Number><ContractID>7</ContractID><ChangeOrderID>65</ChangeOrderID><Amount>1000.0000</Amount></SubContractChangeOrders></NewDataSet> 

것처럼 XML은

다음 오류가 발생했습니다

루트 수준의 데이터가 잘못되었습니다. 1 호선, 6 번 위치.

아이디어가 있으십니까?


업데이트

난 다음에 코드를 변경했습니다. 내부에 모든 테이블이 추가 된 데이터 세트의 구조를 가져올 수 있습니다. 그러나 데이터는 아닙니다.

using (SqlConnection con = new SqlConnection("Server=###;Initial Catalog=####;User ID=###;Pwd=######")) 
     { 
      using (SqlCommand com = new SqlCommand("select * from dbo.tbl_####", con)) 
      { 
       using (SqlDataAdapter ada = new SqlDataAdapter(com)) 
       { 
        ada.Fill(dt); 
        MemoryStream ms = new MemoryStream(); 
        object contractXML1 = dt.Rows[0]["SCOXML1"]; 
        object schema = dt.Rows[0]["xmlSchemaHistory"]; 
        XmlSerializer xs = new XmlSerializer(typeof(object)); 
        xs.Serialize(ms, contractXML1); 
        ms.Position = 0; 
        xDoc.Load(ms); 
        xDocSc.LoadXml(schema.ToString()); 
        ds.ReadXmlSchema(new XmlNodeReader(xDocSc)); 
        ds.ReadXml(new XmlNodeReader(xDoc)); 
       } 
      } 
     } 

그러나 기본 xml 문서에 데이터가 있습니다. 어떤 아이디어?

NLV

답변

5

왜 바이너리 포맷터를 사용하고 있습니까? 사실, 왜 당신은 전혀 연재 중입니까? XML 열이 SQL Server XML 데이터 형식을 사용하고 있지 않습니까? 그렇다면 SqlXml 데이터 형식을 사용하여 데이터를 검색해야합니다.


내가 전에 XML 컬럼 DataTables 함께 일한 적이 없어요. 나는 일반적으로이 목적으로 SqlDataReader을 사용한다. 그러나 힌트를 드릴 수 있습니다. SqlXml 개체를 얻은 후에는 XmlReader을 가져올 수 있습니다. 당신이 XmlReader을 가지고하면, 당신은 할 수 있습니다 :

DataTable dt = new DataTable("tableName"); 
dt.ReadXml(xmlReader); 

페이지의 "ReadXml(XmlReader)"와 "SqlXml.CreateReader Method"를.

+0

좋은 캐치, 나는 그가 시리얼 화기로 무엇을하고 있었는지 확인하지 못했습니다. 코드 검토를 위해 +1. –

+0

SqlXml을 datatable로 변환하는 방법? 어떤 통찰력? 또한 개체를 SqlXml로 변환하는 데 어려움을 겪고 있습니다. – NLV

0

이 어둠 속에서 샷을하지만 XML은 XML의 바이트 순서 마커 (BOM)를 가질 수 있으며, 이진 포맷터가 제대로 인코딩을 지정하지 않고 그것을 처리 할 수 ​​없다. 그렇다면 인코딩 된 스트림에 XML을 먼저로드해야 할 수 있습니다.

관련 문제