Преобразование всех столбцов DateTime в столбцы SqlDateTime в Datatable - PullRequest
2 голосов
/ 09 августа 2010

Что я хочу сделать, это в основном взять любой универсальный DataTable и затем преобразовать все столбцы DateTime в столбцы SqlDateTime.(т. е. если значение столбца datetime = datetime.MinValue, затем установите его в SqlDateTime.Null)

В любом случае я могу сделать это без изменения исходных данных (т. е. без вычисляемых столбцов) или необходимости анализировать затем весьdatatable строка за строкой?

Причина, по которой я хочу это сделать, заключается в том, что мне нужно передать этот Datatable в метод SQLBulkCopy, который бы записал их все вместе в базу данных.Проблема с использованием поля datetime заключается в том, что оно выдает ошибку во время загрузки.

AgentX

Ответы [ 2 ]

0 голосов
/ 14 июля 2015
public void ChangeDateTimeColumn(DataTable newDataTable)
{
    for (int i = 0; i < newDataTable.Rows.Count; i++)
    {
        for (int j = 0; j < newDataTable.Columns.Count; j++)
        {
            DataColumn dc = newDataTable.Columns[j];
            if (dc.DataType == typeof(DateTime))
            {
                string name = dc.ColumnName;
                DataRow row = newDataTable.Rows[i];
                if (row[name] != null && row[name].ToString().Trim() != "")
                {
                    DateTime value = (DateTime)row[name];
                    if (value < (DateTime)SqlDateTime.MinValue)
                    {
                        row[name] = (DateTime)SqlDateTime.MinValue;
                    }
                    else if ((DateTime)SqlDateTime.MaxValue < value)
                    {
                        row[name] = (DateTime)SqlDateTime.MaxValue;
                    }
                }
            }
        }
    }
} 
0 голосов
/ 09 августа 2010

Ну, лучшее, что я мог придумать, было это,

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

у кого-нибудь еще есть ответ?

                Dim dtOut As DataTable = dt.Clone()
                For Each c As DataColumn In dtOut.Columns
                    If c.DataType.FullName = GetType(DateTime).FullName Then
                        c.DataType = GetType(SqlTypes.SqlDateTime)
                    End If
                Next

                dtOut.BeginLoadData()
                Dim drtmp As DataRow
                For Each dr As DataRow In dt.Rows
                    drtmp = dtOut.NewRow()
                    For Each dc As DataColumn In dt.Columns
                        If dc.DataType.FullName = GetType(DateTime).FullName Then
                            If dr(dc) = Date.MinValue Then
                                drtmp(dc.ColumnName) = SqlTypes.SqlDateTime.Null
                            Else
                                drtmp(dc.ColumnName) = dr(dc)
                            End If
                        Else
                            drtmp(dc.ColumnName) = dr(dc)
                        End If
                    Next
                    dtOut.Rows.Add(drtmp)
                Next
                dtOut.EndLoadData()
...