C # - добавить текущую дату / время в таблицу SQL Server во время массового копирования файла CSV - PullRequest
1 голос
/ 12 октября 2019

Я использую следующий код для анализа файла CSV и копирования содержимого в таблицу SQL Server:

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";
                    s.WriteToServer(csvFileData);
                }
            }
        }
    }
}

Столбцы таблицы базы данных одинаково соответствуют столбцам файла CSV, который сделалэто легко написать и выполнить. Но теперь есть новое требование: в той же таблице мне нужно записать дату / время вставки этих записей в свой собственный столбец. Предполагая, что я добавлю столбец в таблицу базы данных с именем InsertDateTime, какую строку (и) кода мне нужно добавить к вышеприведенному, чтобы выполнить это?

1 Ответ

1 голос
/ 12 октября 2019

Как я уже упоминал, зачем это делать в коде? Просто позвольте SQL Server избавить вас от проблем со значением по умолчанию ... Но если вы действительно хотите сделать это в коде, почему бы не добавить дополнительное поле после перечисления?

 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);
                }

                // ==== HERE ADD COLUMM
                csvData.Columns.Add(new DataColumn("CreateDateTime"));

                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;
                        }
                    }

                    // === HERE ADD DEFAULT FIELD, but is weird to add to an array, so a but of Linq will help
                    var fieldList = fieldData.ToList(); // will result in List<string>
                    fieldList.Add(DateTime.Now.ToString());
                    fieldData = fieldList.ToArray();

                    csvData.Rows.Add(fieldData);
                }
            }
        }
        catch (Exception ex)
        {
            return null;
        }
        return csvData;
    }

Просто ReadFields вернет массив полей - и вы можете создать новый массив с дополнительным полем и т. Д. Просто использовать linq и перезаписать ваш массив - это читабельно (и любой может прочитать, почему это происходит)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...