C # - Использование нескольких DataTables с тем же именем и пространством имен в наборе данных - PullRequest
0 голосов
/ 25 января 2012

предположим, у меня есть таблица базы данных MS SQL Server с именем "ГРУППЫ", например:

GROUP_ID    GROUP_NAME    DESCRIPTION
    1        Grp1            Null
    2        Grp2            Null
    3        Grp3            Test

GROUP_ID - это первичное поле с автоматическим приращением, GROUP_NAME - уникальное ненулевое поле varchar, а Description - пустое (необязательное) поле varchar.

Я пытаюсь создать вывод XML в виде веб-службы для использования другим процессом из табличной информации. XML должен выводиться определенным образом.

Конечная цель будет выглядеть так:

<?xml version="1.0" encoding="utf-8"?>
<GROUPS>
    <GROUP>
        <GROUP_ID>1</GROUP_ID>
        <GROUP_NAME>Grp1</GROUP_NAME>
        <DESCRIPTION/>
    </GROUP>
    <GROUP>
        <GROUP_ID>2</GROUP_ID>
        <GROUP_NAME>Grp2</GROUP_NAME>
        <DESCRIPTION/>
    </GROUP>
    <GROUP>
        <GROUP_ID>3</GROUP_ID>
        <GROUP_NAME>Grp1</GROUP_NAME>
        <DESCRIPTION>Test</DESCRIPTION>
    </GROUP>
</GROUPS>

Эта процедура почти дает желаемую цель:

    string sql = "SELECT * FROM GROUPS";
    Response.ContentType = "application/xml"; // Set the page to output XML
        SqlDataAdapter da = new SqlDataAdapter(sql, conn); // SQL Adapter, conn is an already open SQL connection
        DataSet ds = new DataSet("GROUPS"); // Root Node of XML doc will be "GROUPS"
        da.Fill(ds, "GROUP"); // Each record node is a "GROUP"
        XmlTextWriter xml = new XmlTextWriter(Response.Output) { Formatting = Formatting.None }; // XML writer
        xml.WriteStartDocument(); // XML header
        ds.WriteXml(xml); // Write XML output

Проблема этой процедуры заключается в том, что она не обеспечивает требуемые пустые узлы, например, для нулевых значений в таблице. Это будет выглядеть так:

<?xml version="1.0" encoding="utf-8"?>
<GROUPS>
    <GROUP>
        <GROUP_ID>1</GROUP_ID>
        <GROUP_NAME>Grp1</GROUP_NAME>
    </GROUP>
    <GROUP>
        <GROUP_ID>2</GROUP_ID>
        <GROUP_NAME>Grp2</GROUP_NAME>
    </GROUP>
    <GROUP>
        <GROUP_ID>3</GROUP_ID>
        <GROUP_NAME>Grp1</GROUP_NAME>
        <DESCRIPTION>Test</DESCRIPTION>
    </GROUP>
</GROUPS>

После некоторого исследования была предпринята попытка создать желаемый результат с помощью следующей процедуры:

        SqlCommand cmd = new SqlCommand();
        cmd.Connection = conn;
        cmd.CommandText = "SELECT * FROM GROUPS";
        SqlDataReader row = cmd.ExecuteReader();

        DataSet ds = new DataSet("GROUPS");

        while (row.Read())
        {

            DataTable table1 = new DataTable("GROUP" + row["GROUP_ID"]); // This line is the issue
            object[] columns = new object[row.FieldCount];


            for (int i = 0; i < row.FieldCount; i++)
            {

                string name = row.GetName(i);

                    table1.Columns.Add(name);
                    columns[i] = DBstr(row[i]);

            }

            table1.Rows.Add(columns);
            ds.Tables.Add(table1);

        }

        row.Close();

        Response.ContentType = "application/xml"; // Set the page to output XML
        XmlTextWriter xml = new XmlTextWriter(Response.Output) { Formatting = Formatting.None }; // XML writer
        xml.WriteStartDocument(); // XML header
        ds.WriteXml(xml, XmlWriteMode.IgnoreSchema); // Write XML output


    public static string DBstr(Object obj)
    {
        if (obj == null || obj == DBNull.Value)
        {
            return String.Empty; // Default value for null DB value
        }

        else if (obj.GetType() == typeof(DateTime))
        {
            return ((DateTime)obj).ToString("MM/dd/yyyy");
        }
        else
        {
            return obj.ToString();
        }
    }

Проблема здесь заключается в том, что мне пришлось давать либо уникальное имя для каждой таблицы данных, либо уникальное пространство имен. До выписывания XML из DataSet. Так это будет выглядеть примерно так:

<?xml version="1.0" encoding="utf-8"?>
<GROUPS>
    <GROUP1>
        <GROUP_ID>1</GROUP_ID>
        <GROUP_NAME>Grp1</GROUP_NAME>
        <DESCRIPTION/>
    </GROUP1>
    <GROUP2>
        <GROUP_ID>2</GROUP_ID>
        <GROUP_NAME>Grp2</GROUP_NAME>
        <DESCRIPTION/>
    </GROUP2>
    <GROUP3>
        <GROUP_ID>3</GROUP_ID>
        <GROUP_NAME>Grp1</GROUP_NAME>
        <DESCRIPTION>Test</DESCRIPTION>
    </GROUP3>
</GROUPS>

Или в каждой строке GROUP будет добавлен тег xmlns.

В любом случае, нежелательно. Так какой же самый простой способ получить желаемую цель с помощью C # здесь?

Ответы [ 2 ]

1 голос
/ 25 января 2012

Попробуйте изменить запрос

string sql = "ВЫБРАТЬ * ИЗ ГРУПП";

ниже

string sql = "SELECT GROUP_ID, GROUP_NAME, IsNull(DESCRIPTION, '') as DESCRIPTION  FROM GROUPS";
0 голосов
/ 25 января 2012

Без специального сериализатора я не думаю, что вы можете достичь того, что вы хотите. Имена DataTable уникальны по своему дизайну, и сериализация DataSet учитывает эту уникальность по несколько очевидной причине, что они должны быть десериализуемыми, то есть имена должны быть уникальными после сериализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...