dataSet.GetXml () не возвращает xml для пустых или пустых столбцов - PullRequest
5 голосов
/ 05 февраля 2011

Когда я вызываю dataSet.GetXml (), я не получаю никакого XML, возвращаемого для столбцов с пустыми или пустыми значениями Есть ли простой, эффективный способ обойти это? Пример проблемы ниже. Обратите внимание, что a2 отсутствует во втором разделе результатов.

<results>
<a1>test1</a1>
<a2>test2</a2>
<a3>test3</a3>
</results>
<results>
<a1>Atest1</a1>
<a3>Atest3</a3>
</results>

Ответы [ 4 ]

4 голосов
/ 05 февраля 2011

Проблема подробно описана в этой статье Microsoft KB: http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q317961. Подробнее см. Этот предыдущий вопрос SO: DataSet.GetXml не возвращает нулевые результаты .

Я не знаюНе думаю, что есть хорошее решение вашего прямого вопроса.С учетом контекста может существовать и другой способ решения проблемы.

3 голосов
/ 16 октября 2012

Одно решение, которое мне помогло.

Сначала клонируйте DataTable, сделайте все столбцы типа string, замените все нулевые значения на string.empty, затем вызовите GetXml для нового DataSet.

        DataTable dtCloned = dt.Clone();
        foreach (DataColumn dc in dtCloned.Columns)
            dc.DataType = typeof(string);
        foreach (DataRow row in dt.Rows)
        {
            dtCloned.ImportRow(row);
        }

        foreach (DataRow row in dtCloned.Rows)
        {
            for (int i = 0; i < dtCloned.Columns.Count; i++)
            {
                dtCloned.Columns[i].ReadOnly = false;

                if (string.IsNullOrEmpty(row[i].ToString()))
                    row[i] = string.Empty;
            }
        }

        DataSet ds = new DataSet();
        ds.Tables.Add(dtCloned);
        string xml = ds.GetXml();
2 голосов
/ 25 марта 2016

Я искал во всем мире решение для записи нулевых полей в XML с использованием DataSet.WriteXML (). Я обнаружил, что следующие работы оптимизированы по производительности. Я создал функцию для вашего удобства. Измените таблицы набора данных одну за другой, вызвав следующую функцию и заменив таблицы.

    private DataTable GetNullFilledDataTableForXML(DataTable dtSource)
    {
        // Create a target table with same structure as source and fields as strings
        // We can change the column datatype as long as there is no data loaded
        DataTable dtTarget = dtSource.Clone();
        foreach (DataColumn col in dtTarget.Columns)
            col.DataType = typeof(string);

        // Start importing the source into target by ItemArray copying which 
        // is found to be reasonably fast for nulk operations. VS 2015 is reporting
        // 500-525 milliseconds for loading 100,000 records x 10 columns 
        // after null conversion in every cell which may be usable in many
        // circumstances.
        // Machine config: i5 2nd Gen, 8 GB RAM, Windows 7 64bit, VS 2015 Update 1
        int colCountInTarget = dtTarget.Columns.Count;
        foreach (DataRow sourceRow in dtSource.Rows)
        {
            // Get a new row loaded with data from source row
            DataRow targetRow = dtTarget.NewRow();
            targetRow.ItemArray = sourceRow.ItemArray;

            // Update DBNull.Values to empty string in the new (target) row
            // We can safely assign empty string since the target table columns
            // are all of string type
            for (int ctr = 0; ctr < colCountInTarget; ctr++)
                if (targetRow[ctr] == DBNull.Value)
                    targetRow[ctr] = String.Empty;

            // Now add the null filled row to target datatable
            dtTarget.Rows.Add(targetRow);
        }

        // Return the target datatable
        return dtTarget;
    }
0 голосов
/ 26 марта 2014
            if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count == 0)
            {
                foreach (DataTable dt in ds.Tables)
                {
                    foreach (DataColumn dc in dt.Columns)
                    {
                        dc.DataType = typeof(String);
                    }
                }

                DataRow dr = ds.Tables[0].NewRow();
                for (int i = 0; i < dr.ItemArray.Count(); i++)
                {
                    dr[i] = string.Empty;
                }
                ds.Tables[0].Rows.Add(dr);
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...