Я использую C # для анализа файла csv и экспорта в таблицу базы данных SQL Server. Схема таблицы базы данных практически идентична схеме файла csv, за исключением того, что в таблице в качестве первого столбца указан столбец Идентификация первичного ключа.
Проблема: the 2-й столбец таблицы базы данных, который должен получить столбец 1-й файла CSV, фактически получает 2-й столбец файла CSV. В коде предполагается, что первый столбец PK Identity таблицы базы данных является первым столбцом, в который следует записать файл CSV. В случае, если это сбивает с толку, предположим, что столбцы 1, 2 и 3 файла CSV имеют заголовки с именами Contoso1
, Contoso2
и Contoso3
соответственно. Столбцы таблицы базы данных с 1 по 4 называются Id
, Contoso1
, Contoso2
и Contoso3
соответственно. Во время экспорта столбец Id
правильно заполняется идентификатором id, но затем столбец Contoso1
таблицы базы данных заполняется столбцом Contoso2
файла CSV, и отключение одним столбцом продолжаетсядля всех 300 столбцов.
Вот код. Я ищу способ сделать смещение на один столбец с этим кодом. Если возможно, я бы хотел избежать жесткого кодирования схемы отображения, так как существует более 300 столбцов.
using System;
using System.Data.SqlClient;
using System.Data;
using Microsoft.VisualBasic.FileIO;
namespace CSVTest
{
class Program
{
static void Main(string[] args)
{
string csv_file_path = @"pathToCsvFile";
DataTable csvData = GetDataTabletFromCSVFile(csv_file_path);
Console.WriteLine("Rows count:" + csvData.Rows.Count);
InsertDataIntoSQLServerUsingSQLBulkCopy(csvData);
}
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();
//Making empty value as null
for (int i = 0; i < fieldData.Length; i++)
{
if (fieldData[i] == "")
{
fieldData[i] = null;
}
}
csvData.Rows.Add(fieldData);
}
}
}
catch (Exception ex)
{
return null;
}
return csvData;
}
static void InsertDataIntoSQLServerUsingSQLBulkCopy(DataTable csvFileData)
{
using (SqlConnection dbConnection = new SqlConnection("Data Source=localhost;Initial Catalog=Database_Name;Integrated Security=SSPI;"))
{
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);
}
}
}
}
}