Обработка пустых значений в WriteXml - PullRequest
1 голос
/ 31 января 2010

Для преобразования Linq в DataTable я использую следующий метод расширения ( Взято из Stackoverflow)

Linq to DataTable

public static DataTable ToDataTable<T>(this IEnumerable<T> items)
 {
      DataTable table = new DataTable(typeof(T).Name);
      PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public |
                                                    BindingFlags.Instance);
      foreach (var prop in props)
        {
           Type propType = prop.PropertyType;
           // Is it a nullable type? Get the underlying type 
           if (propType.IsGenericType && 
               propType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
               propType = new NullableConverter(propType).UnderlyingType;
                table.Columns.Add(prop.Name, propType);
            }

            foreach (var item in items)
            {
                var values = new object[props.Length];
                for (var i = 0; i < props.Length; i++)
                        values[i] = props[i].GetValue(item, null);
                table.Rows.Add(values);
            }
            return table;
        }

WriteXml

    PersonDB.PersonDataContext con = new PersonDB.PersonDataContext();
    DataTable tb = new DataTable();
    tb = con.Persons.ToDataTable();
    tb.WriteXml(@"d:\temp\Person.xml");

Вопрос


Метод расширения создает файл XML, но для значений NULL в файле XML не создается элемент. В нем говорится, что если поле Commission равно нулю, то элемент комиссии отсутствует в генерации Xml.

Я хочу вставить элемент с пустой строкой для нулевых значений (тип ссылки) и (0,00) для десятичных чисел и (0) для целых чисел. Где мне нужно внести изменения?

Ответы [ 2 ]

2 голосов
/ 31 января 2010

Я бы создал метод расширения для DataTable, который делает это:

public static DataTable ZeroNullValues(this DataTable dataTable)
{
    foreach(DataRow row in dataTable.Rows)
    {
        for(int i=0;i<dataTable.Columns.Count;i++)
        {
            if(row[i] == null)
            {
                Type columnType = dataTable.Columns[i].DataType;
                if(columnType == typeof(string))
                {
                    row[i] = string.Empty;
                }
                else if(columnType == typeof(int) || columnType == typeof(long))
                {
                    row[i] = 0;
                }
                else if(columnType == typeof(float) || columnType == typeof(double))
                {
                    row[i] = 0.00F;
                }
            }
        }
    }
    return dataTable;
}
0 голосов
/ 13 февраля 2013

Как я уже ответил здесь :

Вы можете использовать WriteXmlSchema (и ReadXmlSchema) для хранения схемы для таблицы. Это будет означать, что хотя столбцы NULL не включены в XML, они по-прежнему правильно импортируются.

using (SqlCommand sqlCommand = new SqlCommand(QUERY, CONNECTION))
{
    SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlCommand);
    DataSet dataSet = new DataSet();
    dataAdapter.Fill(dataSet);
    dataSet.WriteXmlSchema(@"C:\TEMP\Schema.xsd");
    dataSet.Tables[0].WriteXml(@"C:\TEMP\Output.xml");
}

Здесь есть действительно полезная статья: Сохранить набор данных в XML с нулевыми значениями

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