2012-05-18 2 views
2

Я делаю массовую вставку:как вставить DateTime в момент (0) поле

// Get the data into the DataTable 
//dtData = GetData(...); 

// Create an object of SqlBulkCopy 
SqlBulkCopy objSBC = new SqlBulkCopy(connection); 
// Specify the destination table 
objSBC.BulkCopyTimeout = 0; 
objSBC.BatchSize = 10000; 
objSBC.DestinationTableName = "QuickLabDump"; 
// Write the data to the SQL Server 

objSBC.WriteToServer(QuickLabDump); 

моего DataTable, что я вставив выглядит так:

QuickLabDump = new DataTable(); 

QuickLabDump.Columns.Add("Time Collected", typeof(TimeSpan)); 
QuickLabDump.Columns.Add("Time Entered", typeof(TimeSpan)); 
QuickLabDump.Columns.Add("Time Completed", typeof(TimeSpan)); 
QuickLabDump.Columns.Add("Test Time", typeof(TimeSpan)); 

QuickLabDump.Columns.Add("Date Collected", typeof(DateTime)); 
QuickLabDump.Columns.Add("Date Entered", typeof(DateTime)); 
QuickLabDump.Columns.Add("Date Completed", typeof(DateTime)); 
QuickLabDump.Columns.Add("Test Date", typeof(DateTime)); 
...... 

При запуске массовой вставки от C# (код выше), я получаю следующее сообщение об ошибке:

The given value of type DateTime from the data source cannot be converted to type time of the specified target column. 

Я думаю, что проблема в том, что я вставив typeof(DateTime) в SQL Server 2008 таблицу, которая является time(0)

Вот пример данных, которые я вставив:

6:50:00 AM 
6:50:00 AM 
6:50:00 AM 
10:36:00 AM 
4:45:00 PM 
7:39:00 PM 

Вопрос: как я могу определить DataTable столбец правильно, так что он будет вставить выше значения времени в столбце time(0)?

Вот ценности, которые уже существуют в таблице базы данных во времени (0) поля:

14:57:00 
14:58:00 
14:58:00 
14:57:00 
10:49:00 
13:31:00 
14:02:00 
14:13:00 
14:20:00 
14:56:00 
15:00:00 

Это, как я добавляю данные в DataTable:

public DataTable dt; 
     public ReadFileIntoDataTable(string inputfile) 
     { 
      using (GenericParserAdapter parser = new GenericParserAdapter()) 
      { 
       parser.SetDataSource(inputfile); 

       char[] delimiters = new char[] { ',' }; 
       parser.ColumnDelimiter = delimiters[0]; 
       parser.FirstRowHasHeader = true; 
       //parser.SkipDataRows = 10; 
       parser.MaxBufferSize = 4096; 
       //parser.MaxRows = 500; 
       parser.TextQualifier = '\"'; 

       dt = parser.GetDataTable(); 


      } 
+0

Вам необходимо избавиться от AM/PM и преобразовать оставшуюся строку в 24-часовой формат времени (d.ToString («H: mm»), где столица «H» означает 24 часа). –

+0

@ RussellFox благодарит так много, я сделал это и почему-то получаю ту же ошибку –

+0

хорошее объяснение., Я пытаюсь понять, что может быть ошибкой. –

ответ

0

я создал явные сопоставления столбцов между моей DataTable и таблицы сервера SQL:

objSBC.ColumnMappings.Add(new SqlBulkCopyColumnMapping("datatable column name","sql server column name")); 

для всех столбцов ..... и что сделал трюк !!!

+0

Значит, имена ваших колонок были неправильными для начала? Вам не нужно явно добавлять сопоставление - просто убедитесь, что имя столбца указано в таблице данных. Опять же, короткий, но полный пример, включающий в себя схему SQL, сделал бы это очевидным намного раньше. –

+0

имена столбцов были правильными для начала. по какой-то причине, когда я добавил это всплывающее сопоставление, это сработало :) Большое вам спасибо за ваше терпение со мной –

+0

@ Артём Царионов: Можете ли вы вырезать и вставить код сопоставления столбцов в свой ответ? Учитывая более раннее смешивание между 'user_name' и' name', я был бы более склонен подозревать подобную ошибку, чем то, что неявное сопоставление столбцов не срабатывало ... –

5

Использование TimeSpan вместо от DateTime. Вы можете получить TimeSpanот a DateTime используя DateTime.TimeOfDay.

Для получения дополнительной информации о сопоставлении типов см. SQL Server Data Type Mappings page on MSDN.

+0

Большое спасибо теперь, я получаю Данное значение типа DateTime из источника данных не может быть преобразовано в тип времени указанного целевого столбца. –

+0

@ Артём Царионов: Вам нужно заменить * все упоминание * 'DateTime' на' TimeSpan' для соответствующих столбцов. –

+0

спасибо. Я редактировал вопрос, показывающий, что у меня также есть столбцы DATETIME в дополнение к временному интервалу и по-прежнему получают ту же ошибку –

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