2015-09-14 2 views
0

Я выбираю из таблицы в Postgres, используя Npgsql. В этой таблице есть столбец auction_time, который является типом time without time zone. Таблица данных, которую читатель возвращает, отличает этот столбец auction_time от DateTime, а не TimeSpan, как я ожидал. Это вызывает проблему при массовом копировании данных в другую таблицу в MS SQLServer типа time(7).Npgsql DataReader использует тип DateTime для времени без часового пояса, а не TimeSpan

Вот где я выбираю из:

using (NpgsqlConnection connection = new NpgsqlConnection(String.Format(PropertyDataDB.ConnectionStringWithSearchPath, schemaName))) 
{ 
    connection.Open(); 
    NpgsqlCommand command = new NpgsqlCommand 
    { 
     CommandText = commandText, 
     Connection = connection 
    }; 

    using (NpgsqlDataReader dataReader = command.ExecuteReader()) 
    { 
     DataTable dt = new DataTable(); 
     //dt = dataReader.GetSchemaTable(); 
     dt.Load(dataReader); 

     BulkCopy(destinationTable, dt); 
    } 
} 

Так auction_type в ДТ будет типа DateTime и все время будет иметь дату 1/1/0001 прилагается к передней части его. Как я могу это предотвратить?

Спасибо.

+1

Это таблица преобразования для типов .NET/PSQL - http://www.npgsql.org/doc/datetime.html. Кажется, что Time w/o TZ делает список раз. Возможно, есть ошибка в сообщении (или, возможно, документация нечеткая)? – StingyJack

+0

Я отправил ошибку на github, они согласны с тем, что это ошибка в версии 2.2.5, но она исправлена ​​в версии 3.x. К сожалению, в версии 3.x есть некоторые изменения. – Dave

+0

У вас есть ссылка на список изменений? Я тоже на 2.x, но я не могу найти целый список, просто некоторые неполные списки веха. – StingyJack

ответ

1

Это то, что я закончил делать, только сделайте что-нибудь подобное, если вам нужно остаться на verison 2.x. Он работает, но мне это совсем не нравится. Я просто клонирую таблицу данных, меняю тип данных и выполняю «приведение», когда это необходимо.

using (NpgsqlConnection connection = new NpgsqlConnection(String.Format(PropertyDataDB.ConnectionStringWithSearchPath, schemaName))) 
{ 
    connection.Open(); 
    NpgsqlCommand command = new NpgsqlCommand 
    { 
     CommandText = commandText, 
     Connection = connection 
    }; 

    using (NpgsqlDataReader dataReader = command.ExecuteReader()) 
    { 
     DataTable dt = new DataTable(); 
     dt.Load(dataReader); 

     if (dt.Columns.Contains("auction_time")) 
     { 
      DataTable clone = dt.Clone(); 
      clone.Columns["auction_time"].DataType = typeof(TimeSpan); 
      foreach (DataRow row in dt.Rows) 
      { 
       DataRow newRow = clone.NewRow(); 
       foreach (DataColumn column in dt.Columns) 
       { 
        if (column.ColumnName == "auction_time" && !row.IsNull(column.Ordinal)) 
        { 
         newRow[column.Ordinal] = ((DateTime)row[column.Ordinal]).TimeOfDay; 
        } 
        else 
        { 
         newRow[column.Ordinal] = row[column.Ordinal]; 
        } 
       } 
      } 
      dt = clone; 
     } 

     BulkCopy(destinationTable, dt); 
    } 
} 

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

  • Нет связанных вопросов^_^