여러 CSV 및 대량 데이터베이스 선택

c# database openfiledialog sqlbulkcopy sql-server

문제

OpenFileDialog 클래스와 함께 MDF 데이터베이스를 사용하여 단일 CSV 파일을 데이터베이스로 가져옵니다. 단일 CSV 파일에서는 정상적으로 작동하지만 여러 CSV 파일을 일괄 적으로 열고 처리해야합니다.

코드를 개선하려면 어떻게해야합니까? for 루프를 사용해 보았습니다.

다음은 단일 CSV 파일을 처리하는 코드입니다.

ofd.Filter = "CSV files (*.csv) | *.csv; | CSV PRN files (*.prn,) |*.prn;";
ofd.FileName = "";
ofd.ShowDialog();
DataTable dt = new DataTable();
string line = null;
int i = 0;
using (StreamReader sr = File.OpenText(ofd.FileName))
{
    while ((line = sr.ReadLine()) != null)
    {
        string[] data = line.Split(',');
        if (data.Length > 0)
        {
            if (i == 0)
            {
                foreach (var item in data)
                {
                    dt.Columns.Add(new DataColumn());
                }

                i++;
            }

            DataRow row = dt.NewRow();
            row.ItemArray = data;
            dt.Rows.Add(row);
        }

    }
}

string symbolName = dt.Rows[1][0].ToString();
string strConnection =
@"Data Source =.\SQLEXPRESS; AttachDbFilename = C:\USERS\JEF\DOCUMENTS\DATABASE1.MDF; Integrated Security = True; Connect Timeout = 30; User Instance = True";
SqlConnection condb2 = new SqlConnection(strConnection);
string createTablerow ="create table ["+symbolName+"] (code1 VARCHAR(100) COLLATE Arabic_CI_AI_KS_WS,date1 varchar(50),open1 varchar(50),high1 varchar(50),low1 varchar(50),close1 varchar(50),vol1 varchar(50))";
using (SqlConnection connection = new SqlConnection(strConnection))
{
    SqlCommand command1 = new SqlCommand(createTablerow, connection);
    connection.Open();
    command1.ExecuteNonQuery();

}
using (SqlConnection cn = new SqlConnection(strConnection))
{
    cn.Open();
    using (SqlBulkCopy copy = new SqlBulkCopy(cn))
    {
        copy.ColumnMappings.Add(0, "code1");
        copy.ColumnMappings.Add(1, "date1");
        copy.ColumnMappings.Add(2, "open1");
        copy.ColumnMappings.Add(3, "high1");
        copy.ColumnMappings.Add(4, "low1");
        copy.ColumnMappings.Add(5, "close1");
        copy.ColumnMappings.Add(6, "vol1");
        copy.DestinationTableName = "[" + symbolName + "]";
        copy.WriteToServer(dt);
    }
}

수락 된 답변

좀 더 효율적으로 코드를 작성해 보았습니다.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Data.SqlClient;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            ofd.FileName = "";
            ofd.ShowDialog();
            string line = null;
            int i = 0;

            string strConnection =
            @"Data Source =.\SQLEXPRESS; AttachDbFilename = C:\USERS\JEF\DOCUMENTS\DATABASE1.MDF; Integrated Security = True; Connect Timeout = 30; User Instance = True";

            using (SqlConnection connection = new SqlConnection(strConnection))
            {
                connection.Open();
                SqlBulkCopy copy = new SqlBulkCopy(connection);

                copy.ColumnMappings.Add(0, "code1");
                copy.ColumnMappings.Add(1, "date1");
                copy.ColumnMappings.Add(2, "open1");
                copy.ColumnMappings.Add(3, "high1");
                copy.ColumnMappings.Add(4, "low1");
                copy.ColumnMappings.Add(5, "close1");
                copy.ColumnMappings.Add(6, "vol1");


                foreach (string file in ofd.FileNames)
                {
                    using (StreamReader sr = File.OpenText(file))
                    {
                        DataTable dt = new DataTable();

                        while ((line = sr.ReadLine()) != null)
                        {
                            string[] data = line.Split(',');
                            if (data.Length > 0)
                            {
                                if (i == 0)
                                {
                                    foreach (var item in data)
                                    {
                                        dt.Columns.Add(new DataColumn());
                                    }

                                    i++;
                                }

                                DataRow row = dt.NewRow();
                                row.ItemArray = data;
                                dt.Rows.Add(row);
                            }
                        }

                        string symbolName = dt.Rows[1][0].ToString();

                        string createTable = string.Format("create table [{0}] (code1 VARCHAR(100) COLLATE Arabic_CI_AI_KS_WS,date1 varchar(50),open1 varchar(50),high1 varchar(50),low1 varchar(50),close1 varchar(50),vol1 varchar(50))",
                            symbolName);

                        using (SqlCommand command1 = new SqlCommand(createTable, connection))
                        {
                            command1.ExecuteNonQuery();

                            copy.DestinationTableName = "[" + symbolName + "]";
                            copy.WriteToServer(dt);

                        }
                    }
                }
            }
        }
    }
}

인기 답변

한 번에 여러 파일을 처리하려면 병렬 코드를 사용해야합니다. "for"를 사용하는 것은 좋은 시도 였지만 "for"루프는 여전히 동시에 실행됩니다. 이는 한 번에 하나씩을 의미합니다.

이 경우 병렬 처리를 수행하는 가장 쉬운 방법은 Parallel.Foreach를 사용하는 것입니다. 여기에 대한 Microsoft 안내서가 있습니다. https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/how -to-write-a-simple-parallel-foreach-loop



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.