sqlbulkcopy - 문자열을 DateTime으로 변환 할 때

c# csv datetime excel sqlbulkcopy

문제

이 코드를 사용하여 데이터베이스에 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'예외가 발생했습니다. 그래서 나는 뭔가가 Dates와 관련되어 있다는 것을 알고 있으며 Excel 컬럼이 'Date'의 가치가 있다는 것을 알고 있습니다.

임씨는 이걸 가지고 내 머리를 긁적니다. 날짜가있는 열을 구문 분석하는 좋은 방법은 무엇입니까?

인기 답변

나는 당신에게 약간의 문제를 일으킬 수있는 당신의 코드에 관한 몇 가지 이슈를 발견했다.

  1. CSV 파일의 스키마 유효성 검사가 없습니다. 간단한 CSV 파일을 가져 와서 열 머리글을 사용하여 서버에 쓰려고합니다.
  2. DataColumn 인스턴스를 만들면 기본 열 유형은 System.String 됩니다. 아마도 날짜 문제가 발생했을 수 있습니다.
  3. CSV 파일에 데이터가 변환되지 않습니다. 데이터베이스 테이블의 필드 중 하나가 datetime 이고 System.String 열을 대량 삽입하려고하면 문제가 발생합니다.

내 제안은 다음과 같습니다 :

  1. CSV 파일에서 스키마 유효성 검사를 수행하여 원하는 입력을 얻었음을 알 수 있습니다. 이는 데이터가 예상 된 형식인지 확인하고 예상되는 열 머리글이 있는지 확인하는 두 가지 방법입니다.
  2. 대량 삽입하는 테이블의 경우 SQL 테이블에 적합한 열 유형을 작성하십시오. 열 데이터 형식을 지정하는 DataColumn 생성자의 오버로드를 사용합니다. new DataColumn("Name", typeof(DateTime))
  3. L의 OAD에게 다음, 필요한 포맷으로 당신 E는 CSV에서 xtracted 데이터 (문자열로 모두) 및 T의 ransform을 가져 가라.

수행중인 작업은 매우 기본적인 ETL 입니다. Extract 및 Load 부분이 작동하는 것처럼 보입니다. 누락 된 부분은 Transform 구성 요소입니다.



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