Я использую этот код для вставки файла csv в мою базу данных:
private void InsertDataIntoSQLServerUsingSQLBulkCopy(DataTable csvFileData)
{
using (SqlConnection dbConnection = new SqlConnection(ConnectionString))
{
dbConnection.Open();
using (SqlBulkCopy s = new SqlBulkCopy(dbConnection))
{
s.DestinationTableName = "tablename";
foreach (var column in csvFileData.Columns)
s.ColumnMappings.Add(column.ToString(), column.ToString());
s.WriteToServer(csvFileData);
}
}
}
private static DataTable GetDataTabletFromCSVFile(string csv_file_path)
{
DataTable csvData = new DataTable();
try
{
using (TextFieldParser csvReader = new TextFieldParser(csv_file_path))
{
csvReader.SetDelimiters(new string[] { "," });
csvReader.HasFieldsEnclosedInQuotes = true;
string[] colFields = csvReader.ReadFields();
foreach (string column in colFields)
{
DataColumn datecolumn = new DataColumn(column);
datecolumn.AllowDBNull = true;
csvData.Columns.Add(datecolumn);
}
while (!csvReader.EndOfData)
{
string[] fieldData = csvReader.ReadFields();
for (int i = 0; i < fieldData.Length; i++)
{
if (fieldData[i] == "")
{
fieldData[i] = null;
}
}
csvData.Rows.Add(fieldData);
}
}
}
В моей базе данных есть временные данные. Чтобы протестировать этот код, я скопировал поля с заголовками с SQL-сервера и вложил их в файл excel. Затем я сохранил файл excel в csv и запустил код. Он прекрасно добавляет данные из csv в базу данных!
Затем я попробовал запустить файл csv с аналогичными значениями в моем исходном файле csv и дал мне исключение «String to DateTime». Поэтому я знаю, что что-то связано с датами, и я знаю, что столбцы excel имеют значение «Дата».
Я действительно почесываю голову этим. Любой хороший способ разбора столбцов с датами?
Я замечаю несколько проблем с вашим кодом, что может вызвать некоторые проблемы.
DataColumn
, стандартным типом столбца будет System.String
. Вероятно, это вызывает проблемы с датой. datetime
и вы пытаетесь увеличить объем вставки столбца System.String
вы столкнетесь с проблемами. Мои предложения были бы следующими:
DataColumn
где вы указываете тип данных столбца: new DataColumn("Name", typeof(DateTime))
Операция, которую вы выполняете, является очень простой ETL . Похоже, что вы работаете с частью Extract и Load, то, что вам не хватает, это компонент Transform.