Сериализация DataSet в XML - пропущенные столбцы с нулевыми значениями - PullRequest
0 голосов
/ 30 сентября 2018

Я интегрирую новую систему с унаследованной системой, одним из требований является запись данных кэша в формате XML.Я декомпилировал унаследованную систему и сумел максимально приблизиться к формату данных требований.

Вот что унаследованная система делает:

DataSet formData = getDatasetValuesSomehow();

using (StringWriter stringWriter = new StringWriter())
{
    formData.WriteXml((TextWriter) stringWriter, XmlWriteMode.DiffGram);
    stringWriter.Flush();
}

Вывод выглядит так:

<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
    <NewDataSet>
        <VALUES diffgr:id="VALUES1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
            <DEBUG_ID>9141c23e-1149-4ba2-b5d1-5c8c77561f0d</DEBUG_ID>
            <DATECREATED>2018-09-24T15:28:00.3769504+01:00</DATECREATED>
            <DATELASTMODIFIED>2018-09-24T15:28:00.3769504+01:00</DATELASTMODIFIED>
            <CREATEDBY>TRAILMAX</CREATEDBY>
            <LASTMODIFIEDBY>TRAILMAX</LASTMODIFIEDBY>
            <TEXT>Oh MY!</TEXT>
            <DATE>2018-09-24T00:00:00+01:00</DATE>
            <INTEGER>42</INTEGER>
            <KEY1 />
        </VALUES>
    </NewDataSet>
</diffgr:diffgram>

Представляет все значения в строке таблицы базы данных.Обратите внимание на <KEY1 /> - это поле со значением null.

Когда я делаю то же самое (относительно того, как я получаю XML), я получаю только поля со значениями в нем, нет нулевых полей:

<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
  <NewDataSet>
    <VALUES diffgr:id="VALUES1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
      <DEBUG_ID>32ac8a83-a45b-473c-9890-d47a4b274426</DEBUG_ID>
      <TEXT>Hello world</TEXT>
      <DATE>2018-09-30T15:16:13.63+01:00</DATE>
    </VALUES>
  </NewDataSet>
</diffgr:diffgram>

Но схема таблицы такая же, здесь я также должен увидеть <KEY1 /> и <INTEGER /> и другие поля.

Вот мой C #:

[Test]
public void Another_Test_ExpectedBehaviour()
{
    var resultDataSet = new DataSet();
    DataTable values = resultDataSet.Tables.Add("VALUES");
    DataRow valuesRow = values.NewRow();
    var recordId = Guid.NewGuid(); // that's just dummy here - I have a value coming from somewhere
    using (var sqlConnection = new SqlConnection(ConfigurationContext.Current.GetHrnetConnectionstring()))
    {
        sqlConnection.Open();
        var sqlCommand = new SqlCommand("SELECT top 1 * from DEBUG where DEBUG_ID = @1", sqlConnection);
        sqlCommand.Parameters.AddWithValue("@1", recordId);
        using (SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlCommand))
        {
            var dataTable = new DataTable();
            dataAdapter.Fill(dataTable);

            var dataRow = dataTable.Rows[0];
            foreach (DataColumn column in dataTable.Columns)
            {
                string columnName = column.ColumnName;
                object columnValue = RuntimeHelpers.GetObjectValue(dataRow[columnName, DataRowVersion.Default]);

                values.Columns.Add(columnName, column.DataType);
                valuesRow[columnName] = columnValue;
            }
        }
    }
    values.Rows.Add(valuesRow);

    // Now get XML
    using (StringWriter stringWriter = new StringWriter())
    {
        resultDataSet.WriteXml(stringWriter, XmlWriteMode.DiffGram);
        stringWriter.Flush();
        var xml = stringWriter.ToString();
    }
}

Когда я отлаживаю это и смотрю в окончательное состояние resultDataSet, я вижу, что доступны все столбцы: All the columns are available int the list of columns when inspected in debug

Но только те, у кого есть значения, попадают в XML.Как я могу показать пустые столбцы в XML при десериализации?Изменить: вот устаревший системный код: https://gist.github.com/trailmax/0100bd6926f311fae277848ce7624e98 - я не вижу, что я делаю по-другому, но они получают нулевые столбцы, а я нет.Только они на .Net 3.5 а я на 4.7.1

...