2012-01-25 5 views
0

предположим у меня есть таблица базы данных MS SQL Server с именем «группы», такие как:C# - Использование нескольких DataTables одного и того же имени и пространства имен в DataSet

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

GROUP_ID является первичное поле автоматическое приращение , GROUP_NAME - это уникальное ненулевое поле varchar, а описание - допустимое (необязательное) поле 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(); 
     } 
    } 

Проблема здесь в том, что я должен был дать либо уникальное имя для каждого DataTable или уникальное пространство имен. Перед записью 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> 

Или каждая группа строк будет иметь XMLNS тег выброшен в

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

+0

FYI, вы не должны использовать 'new XmlTextWriter()'. Вместо этого вы должны использовать 'XmlWriter.Create()'. –

ответ

1

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

строка SQL = "SELECT * FROM ГРУППЫ";

ниже

string sql = "SELECT GROUP_ID, GROUP_NAME, IsNull(DESCRIPTION, '') as DESCRIPTION FROM GROUPS"; 
+0

Обработка этого запроса на стороне запроса - это умное и простое решение этой конкретной проблемы, и я не рассматривал ее. Для этой конкретной проблемы это решение работает. – user17753

+0

Тем не менее, мне все же интересно, если бы мне пришлось создавать DataSet с нуля на C#, как в случае использования адаптера данных. Как я могу построить его на C# для создания желаемого XML с помощью метода writeXML DataSet? – user17753

+0

Вы можете google XMLElement в C# – Pankaj

0

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

+0

Я понимаю это. На этом этапе я могу создать желаемый результат, манипулируя запросом. Как SqlDataAdapter может создать DataSet с одной таблицей, которая производит нужный вывод с помощью WriteXML?Если бы я должен был отказаться от SqlDataAdapter и вместо этого вручную перебирать каждую строку результата запроса, я не могу создать аналогичный DataSet, созданный адаптером. – user17753

+0

Nevermind Я решил свою проблему. По-видимому, мне не нужно добавлять DataTable для каждой «записи/строки» в XML. Требуется только одна таблица, все они берут имя одной таблицы. – user17753

Смежные вопросы