2014-05-28 2 views
2

Я использую команду SqlBulkCopy для ввода данных в таблицу sql. У меня есть первый столбец, который равен CreatedDate, я установил значение по умолчанию или привязку к getdate() без кавычек. Тем не менее, представляется, что, когда bulkCopy.WriteToServer(table); вызывается брошено следующее сообщение об ошибке:Автоматическое добавление SQL-данных с использованием SqlBulkCopy с C#

Приведенное значение типа String, из источника данных не может быть преобразовано в тип DateTime указанного целевого столбца.

Внутренняя Исключение составляет

Не удалось преобразовать значение параметра из строки в DateTime.

Я установил значение по умолчанию или привязку для столбцов CreatedDate до getdate(). Это автоматически вставляет текущую дату и время в столбец, когда выполняется команда SqlBulkCopy?

Нужно ли добавить столбец CreatedDate в DataTable? Если у меня есть столбцы, которые автоматически вставлены, мне нужно их сопоставить или добавить? Если да, как бы вы добавляли или сопоставляли столбец типа данных SQL datetime?

var conn = new SqlConnection(connectionString); 
var sessionId = Guid.NewGuid(); 

var table = new DataTable(); // create the datatable 

table.Columns.Add("location", typeof (string)); 
table.Columns.Add("product_name", typeof (string)); 
table.Columns.Add("product_id", typeof (string)); 
table.Columns.Add("product_price", typeof (string)); 
table.Columns.Add("session_id", typeof (string)); 

foreach (var pair in idsAndPrices) // then loop all dictionary entries and add the rows 
{ 
    table.Rows.Add(location, productName, pair.Key, pair.Value, sessionId); 
} 

using (var bulkCopy = new SqlBulkCopy(conn)) 
{ 
    bulkCopy.DestinationTableName = "dbo.ProductInventory"; 
    conn.Open(); 
    bulkCopy.WriteToServer(table); // write to database 
    conn.Close(); 
} 
+0

Вы можете добавить столбец datetime в свой стол. Стандартный формат даты и времени SQL: YYYY-MM-DD HH: MM: SS. Таким образом, вы можете получить текущее время datetime в .net, используя 'DateTime.now'. Затем вы можете проанализировать это datetime с помощью string.format, например, так: 'string.Format (" {0: yyyy-MM-dd HH: mm: ss} ", DateTime.now)' Это форматированное datetime может быть введено в БД. – Elias

ответ

1

Я просмотрел порядок строк в базе данных, и они были изменены. Чтобы исправить это, я применил SqlBulkCopyColumnMapping, чтобы убедиться, что имена столбцов были выровнены до вызова. bulkCopy.WriteToServer(); Стол «CreatedDate» в базе данных автоматически заполняет таблицу при добавлении записей. Для столбцов, которые автоматически увеличиваются, вам не нужно сопоставлять, но желательно сопоставить другие столбцы.

  var table = new DataTable(); // create the datatable 

      table.Columns.Add("location", typeof (string)); 
      table.Columns.Add("product_name", typeof (string)); 
      table.Columns.Add("product_id", typeof (string)); 
      table.Columns.Add("object_price", typeof (string)); 
      table.Columns.Add("session_id", typeof (string)); 


      foreach (var pair in webidsAndXPaths) // then loop all dictionary entries and add the rows 
      { 
       table.Rows.Add(location, productName, pair.Key, pair.Value, sessionId); 
      } 

      using (var bulkCopy = new SqlBulkCopy(conn)) 
      { 
       // Set up the column mappings by name. 
       var l = new SqlBulkCopyColumnMapping("location", "location"); 
       var pn = new SqlBulkCopyColumnMapping("product_name", "product_name"); 
       var pid = new SqlBulkCopyColumnMapping("product_id", "product_id"); 
       var pp = new SqlBulkCopyColumnMapping("product_price", "product_price"); 
       var sid = new SqlBulkCopyColumnMapping("session_id", "session_id"); 


       bulkCopy.ColumnMappings.Add(l); 
       bulkCopy.ColumnMappings.Add(pn); 
       bulkCopy.ColumnMappings.Add(pid); 
       bulkCopy.ColumnMappings.Add(pp); 
       bulkCopy.ColumnMappings.Add(sid); 

       // destinationDatabase = "dbo.ObjectInventory" 
       bulkCopy.DestinationTableName = destinationDatabase; 
       conn.Open(); 
       bulkCopy.WriteToServer(table); // write to database 
       conn.Close(); 
      } 

      return true; 
1

Это соответствует вашим потребностям?

// Add a column with the correct name 
table.Columns.Add("CreatedDate", typeof (DateTime)); 
// ... 
// Update the row you are inserting 
table.Rows.Add(location, productName, pair.Key, pair.Value, sessionId, DateTime.Now); 
Смежные вопросы