1

だから私はDataTableにデータをクエリしています

using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
       DataSet dataSet = new DataSet();
       adapter.Fill(dataSet, "AccessRights");

       return dataSet.Tables[0];
}

次に、クライアントに送り返すXMLの作成を開始します

string tableData = null;
using(StringWriter sw = new StringWriter())
{                    
      rightsTable.WriteXml(sw);
      tableData = sw.ToString();                    
}

 StringBuilder build = new StringBuilder();               
 using (XmlWriter writer = XmlWriter.Create(build, new XmlWriterSettings { OmitXmlDeclaration = true }))
 {
      writer.WriteStartElement("useraccess");
      writer.WriteCData(xmlTable.OuterXml);
      writer.WriteEndElement();
 }

クライアントで、XmlからDataTableを取得する必要があります

XmlCDataSection cDataNode = (XmlCDataSection)xdoc.SelectSingleNode("./mp_getindividualaccessrights_response/data/useraccess").ChildNodes[0];
string xmlDataString = cDataNode.Data.ToString();
StringReader sReader = new StringReader(xmlDataString);
string s = sReader.ToString();
DataSet ds = new DataSet();

ds.ReadXml(sReader);

return ds.Tables[0];

これは、DataTableの列と行を返すデータがデータベースにある場合に機能します

データベースに結果がない場合に問題が発生します。行データがない場合でも、列をxml文字列に格納する必要があります(dt.WriteXml()の場合)。しかし、何が起こるかというと、dt.WriteXml()が返されるxml文字列が、私が望まない空のタグである場合です。基本的に、データ行がない場合でも、タグにデータベースクエリの列を含める必要があります。

事実、DataTableには列(dt.Tables [0] .Columns.Count)があり、0より大きい数値を取得し、I(dt.Tables [0] .Rows.Count)の場合は0を取得します。これで問題ありません。原因照会したときに、探していた結果が見つかりませんでしたが、列はまだ存在しています。しかし、DataTable.WriteXML()を実行すると、列が消えます。

行が見つかったかどうかに関係なく、列をxml文字列に表示したい。しかし、DataTable.WriteXmlはこれを正しく行っていないようです。

誰かがこの問題について私を助けてくれませんか。

編集:この問題をよりよく説明するためにいくつかのテストコードを追加しました

DataTable dt = new DataTable();
        DataColumn[] dtc = new DataColumn[] { new DataColumn("Name"), new DataColumn("Age"), new DataColumn("Surname") };
        DataSet ds = new DataSet();
        ds.Tables.Add(dt);
        dt.Columns.AddRange(dtc);

        string xmlString = null;
        using (StringWriter sw = new StringWriter())
        {
            ds.WriteXml(sw);
            xmlString = sw.ToString();
        }

        XmlDocument doc = new XmlDocument();
        StringBuilder build = new StringBuilder();
        using (XmlWriter writer = XmlWriter.Create(build, new XmlWriterSettings { OmitXmlDeclaration = true }))
        {
            writer.WriteStartElement("Root");
            writer.WriteCData(xmlString);
            writer.WriteEndElement();
        }

        XmlDocument xdoc = new XmlDocument();
        xdoc.LoadXml(build.ToString());

        XmlCDataSection cDataNode = (XmlCDataSection)xdoc.SelectSingleNode("./Root").ChildNodes[0];
        string xmlDataString = cDataNode.Data.ToString();
        StringReader sReader = new StringReader(xmlDataString);
        DataSet ds1 = new DataSet();

        ds1.ReadXml(sReader);

        Console.WriteLine(ds1.Tables[0].Columns.Count);

        Console.ReadLine();

DataSetからxml出力

上の画像から:これは、DataTableに行がないために返されますが、DataTableには、必要なxmlに反映されていない列があります。したがって、基本的には次のように見えるxmlが必要です

<DataSet>
   <Name></Name>
   <Age></Age>
   <Surname></Surname>
<DataSet>

しかし、ds.WriteXml()はこれを許可していません。

4

1 に答える 1

3

これは、行データがあるかどうかに関係なく、列を表示するために必要なことです。スキーマは、データ テーブルのメタ データを保持します。XmlWriteMode と XmlReadMode がスキーマに設定されていることを確認してください。

ds.WriteXml(sReader, XmlWriteMode.WriteSchema);
ds.ReadXml(sReader, XmlReadMode.ReadSchema);

これにより、列名と列のデータ型を含むすべてのテーブル データが保持されます。

于 2012-09-17T14:54:32.430 に答える