Copy CSV file to MS Access Table

2019-05-18 20:04发布

问题:

using C# I am trying to create a console app that reads a CSV file from a specific folder location and import these records into a MS Access Table. Once the records in the file have been imported successfully I will then delete the .csv file.

So far this is what I have:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Configuration;
using System.Data;
using System.Data.OleDb;
using System.Globalization;

namespace QuantumTester
{
class Program
{
    static void Main(string[] args)
    {        
       CsvFileToDatatable(ConfigurationManager.AppSettings["CSVFile"], true);
    }

    public static DataTable CsvFileToDatatable(string path, bool IsFirstRowHeader)//here Path is root of file and IsFirstRowHeader is header is there or not
    {
        string header = "Yes"; //"No" if 1st row is not header cols
        string sql = string.Empty;
        DataTable dataTable = null;
        string pathOnly = string.Empty;
        string fileName = string.Empty;

        try
        {

            pathOnly = Path.GetDirectoryName(ConfigurationManager.AppSettings["QuantumOutputFilesLocation"]);
            fileName = Path.GetFileName(ConfigurationManager.AppSettings["CSVFilename"]);

            sql = @"SELECT * FROM [" + fileName + "]";

            if (IsFirstRowHeader)
            {
                header = "Yes";
            }

            using (OleDbConnection connection = new OleDbConnection(
                    @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly +
                    ";Extended Properties=\"Text;HDR=" + header + "\""))
            {
                using (OleDbCommand command = new OleDbCommand(sql, connection))
                {
                    using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
                    {
                        dataTable = new DataTable();
                        dataTable.Locale = CultureInfo.CurrentCulture;
                        adapter.Fill(dataTable);
                    }
                }
            }
        }
        finally
        {

        }
        return dataTable;
    }
}
}

Can I just go ahead an save the datatable to a table I have created in the Access DB? How would I go about doing this? Any help would be great

回答1:

You can run a query agains an Access connection that creates a new table from a CSV file or appends to an exisiting table.

The SQL to create a table would be similar to:

SELECT * INTO NewAccess 
FROM [Text;FMT=Delimited;HDR=NO;DATABASE=Z:\Docs].[Table1.csv]

To append to a table:

INSERT INTO NewAccess 
SELECT * FROM [Text;FMT=Delimited;HDR=NO;DATABASE=Z:\Docs].[Table1.csv]


回答2:

finally got this working and this is what I have - hope it helps someone else in the future:

public static DataTable CsvFileToDatatable(string path, bool IsFirstRowHeader)//here    Path is root of file and IsFirstRowHeader is header is there or not
    {
        string header = "Yes"; //"No" if 1st row is not header cols
        string query = string.Empty;
        DataTable dataTable = null;
        string filePath = string.Empty;
        string fileName = string.Empty;

        try
        {
            //csv file directory
            filePath = Path.GetDirectoryName(ConfigurationManager.AppSettings["QuantumOutputFilesLocation"]);
            //csv file name
            fileName = Path.GetFileName(ConfigurationManager.AppSettings["CSVFilename"]);

            query = @"SELECT * FROM [" + fileName + "]";

            if (IsFirstRowHeader) header = "Yes";

            using (OleDbConnection connection = new OleDbConnection((@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties=\"Text;HDR=" + header + "\"")))               
            {
                using (OleDbCommand command = new OleDbCommand(query, connection))
                {
                    using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
                    {                                                     
                        dataTable = new DataTable();
                        adapter.Fill(dataTable);

                        //create connection to Access DB
                        OleDbConnection DBconn = new OleDbConnection(ConfigurationManager.ConnectionStrings["Seagoe_QuantumConnectionString"].ConnectionString);
                        OleDbCommand cmd = new OleDbCommand();
                        //set cmd settings
                        cmd.Connection = DBconn;
                        cmd.CommandType = CommandType.Text;
                        //open DB connection
                        DBconn.Open();
                        //read each row in the Datatable and insert that record into the DB
                        for (int i = 0; i < dataTable.Rows.Count; i++)
                        {
                            cmd.CommandText = "INSERT INTO tblQuantum (DateEntered, Series, SerialNumber, YearCode, ModelNumber, BatchNumber, DeviceType, RatedPower, EnergyStorageCapacity," +
                                                                      "MaxEnergyStorageCapacity, User_IF_FWRevNo, Charge_Controller_FWRevNo, RF_Module_FWRevNo, SSEGroupNumber, TariffSetting)" +
                                             " VALUES ('" + dataTable.Rows[i].ItemArray.GetValue(0) + "','" + dataTable.Rows[i].ItemArray.GetValue(1) + "','" + dataTable.Rows[i].ItemArray.GetValue(2) +
                                             "','" + dataTable.Rows[i].ItemArray.GetValue(3) + "','" + dataTable.Rows[i].ItemArray.GetValue(4) + "','" + dataTable.Rows[i].ItemArray.GetValue(5) +
                                             "','" + dataTable.Rows[i].ItemArray.GetValue(6) + "','" + dataTable.Rows[i].ItemArray.GetValue(7) + "','" + dataTable.Rows[i].ItemArray.GetValue(8) +
                                             "','" + dataTable.Rows[i].ItemArray.GetValue(9) + "','" + dataTable.Rows[i].ItemArray.GetValue(10) + "','" + dataTable.Rows[i].ItemArray.GetValue(11) +
                                             "','" + dataTable.Rows[i].ItemArray.GetValue(12) + "','" + dataTable.Rows[i].ItemArray.GetValue(13) + "','" + dataTable.Rows[i].ItemArray.GetValue(14) + "')";

                            cmd.ExecuteNonQuery();
                        }
                        //close DB.connection
                        DBconn.Close();
                    }
                }
            }
        }
        finally
        {

        }
        return dataTable;
    }