2009-01-28 5 views
10

asp.net Visual Studio 2008/SQL 2000 (향후 2005)에서 C#을 사용하여 프로젝트를 시작합니다.csv 파일 가져 오기/sql 데이터베이스 asp.net

나에게있어 까다로운 부분은 기존 DB 스키마가 자주 변경되고 가져 오기 파일 열이 모두 열 이름에 일대일 일치가 아니기 때문에 기존 db 스키마와 일치해야한다는 것입니다. (내가 사용할 컬럼 이름을 테이블 스키마에 제공하는 조회 테이블이 있습니다.)

저는이 접근 방법에 대해 조사 중이며 전문가의 조언이 필요합니다. 이 중 어떤 것을 수행하기 위해 내가 활용할 수있는 기존의 컨트롤이나 프레임 워크가 있습니까?

지금까지 내가 SlickUpload 등의 업로드를 달성하기는 FileUpload .NET 컨트롤뿐만 아니라 일부 타사 업로드 컨트롤을 탐구하지만

다음 부분은 내 csv로의 읽고 < 5백메가바이트해야 업로드 한 파일/엑셀과 사용자에게 표시되도록 파싱하여 db 스키마와 일치시킬 수 있습니다. 나는 CSVReader과 다른 사람을 보았지만 다른 버전을 지원해야하기 때문에 더 힘들어합니다.

기본적으로이 가져 오기를 수행하는 사용자는이 가져 오기 파일에서 여러 테이블을 삽입하거나 업데이트합니다. 레코드 일치와 같은 더 많은 사전 요구 사항이 있지만 가져 오기 레코드 미리보기가 있지만 먼저이 작업을 수행하는 방법을 이해하고 싶습니다.

업데이트 : csv 파일을 업로드하기위한 LumenWorks.Framework와 함께 csvReader를 사용하여 종료했습니다.

답변

1

나는 csv 파일을 SQL 테이블과 내가 만든 데이터베이스의 DataTable로 업로드하고 가져 오기위한 LumenWorks.Framework의 csvReader를 사용하고있다. 가져온 열에

또한 사용자가 ui의 필드를 매핑하고 각 레코드를 삽입/업데이트/오류로 레이블을 지정하여 가져 오기 용 데이터의 유효성을 검사하고 준비합니다. 그런 다음 영향을받을 각 테이블에 대해 강력하게 형식화 된 DataSet을 만들고 채우고 엔터프라이즈 라이브러리 UpdateDataset() 메서드에 대한 삽입/업데이트 쿼리를 작성합니다.

그런 다음 트랜잭션을 제출하여 데이터베이스를 삽입/업데이트합니다. -

매핑은 4 열로 구성된 표입니다. (가져 오기 필드 이름, 대상 테이블, 대상 필드 이름, 무시, 일치 상태), 대상 테이블 및 필드 이름은 선택된 테이블을 기반으로 새로 고침됩니다. 선택 항목을 동적으로 채 웁니다. 일치 항목이 발견되면 처음에는 선택 콤보에 1 개의 값이 채워 지거나 일치하지 않으면 선택하십시오. ignore는 사용자가 필드를 무시할 수있게합니다. 일치 상태는 필드가 자동 매핑 된 경우입니다.

5

Excel 또는 CSV 파일을 통해 IDataReader를 쉽게 만들 수 있습니다 (http://support.microsoft.com/kb/316934 참조).

데이터베이스 엔진으로 SQL Server를 사용하고 있습니까? 그렇다면 SqlBulkCopy 클래스 (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx)를 사용하여 효율적으로 IDataReader를 가져와 열을 적절하게 매핑하고 결과를 데이터베이스에 저장할 수 있습니다.

+0

예, SQL Server 2000을 사용하고 있지만 SQL Server 2005도 지원해야합니다. 나는 SqlBulkCopy에 익숙하지 않고 이것을 살펴볼 것이다. 업데이트가 가능하려면 다른 것을 사용해야 할 것이라고 상상해보십시오. – kiev

+0

아 맞아요. 삽입과 업데이트를 모두해야합니까? SqlBulkCopy는 데이터베이스에 많은 양의 데이터를 효율적으로 삽입하는 데 적합하지만 직접 업데이트를 처리하지 않습니다. 스테이징 테이블 및 추가 SQL을 사용하여 실제로 수정할 테이블로 데이터를 이동할 수 있습니다. –

3

나는이 잠재적으로 매우 복잡한 응용 프로그램을 돕기 위해 강력하고 유연한 도구가있을 것으로 의심됩니다.

여기서 나는 Excel 파일을 DataTable로 감추는 데 유용한 기능을 발견했습니다. 이 버전은 첫 번째 워크 시트 만 찾습니다. 출발점 역할을 할 수도 있습니다. To csv 파일과 비슷한 어떤 연결 문자열을 수정해야합니다.

public static DataTable GetDataTableFromExcel(string SourceFilePath) 
{ 
    string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + 
           "Data Source=" + SourceFilePath + ";" + 
           "Extended Properties=Excel 8.0;"; 

    using (OleDbConnection cn = new OleDbConnection(ConnectionString)) 
    { 
     cn.Open(); 

     DataTable dbSchema = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
     if (dbSchema == null || dbSchema.Rows.Count < 1) 
     { 
      throw new Exception("Error: Could not determine the name of the first worksheet."); 
     } 

     string WorkSheetName = dbSchema.Rows[0]["TABLE_NAME"].ToString(); 

     OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [" + WorkSheetName + "]", cn); 
     DataTable dt = new DataTable(WorkSheetName); 

     da.Fill(dt); 

     return dt; 
    } 
} 
+0

유감스럽게도 x86 플랫폼에서만 jet이 존재하기 때문에 x64 시스템에서는 작동하지 않습니다. – Alex

8

체크 아웃 우수한 FileHelpers 라이브러리 - 거기에 대한 article on CodeProject, 그것은 here를 호스팅.

순수한 C#이며 모든 플랫 파일, CSV를 가져올 수 있으며 Excel에서도 사용할 수 있습니다. 가져 오기는 완전히 구성 가능합니다. 구분 기호, 행 및/또는 열 건너 뛰기 등을 정의 할 수 있습니다. 옵션을 많이 사용합니다.

다양한 프로젝트에서 성공적으로 사용했으며 완벽하게 작동합니다. 적극 권장합니다.

+0

Marc, FileHelpers를 보아 주셔서 감사합니다. 나는 동적 일 필요가있는 소스/디테일 파일의 레코드에 매핑되는 클래스를 정의해야합니다. 내 CSV 또는 Excel 파일이 모두 동일한 형식이 아니므로 대상 열과 일치해야합니다. – kiev

+0

좋아요, 당신의 문제를 봅니다 - 당신이 그걸 어떻게 쉽게 해결할 수 있을지 모르겠지만 ----- 완전히 역동적 인 것 .... 정확히 쉬운 일은 아닙니다! 당신의 수색에 행운을 비네. –

1

FileHelpers은 (는) 친구입니다. 나는 그것을 여러 프로젝트에서 행복하게 사용했고 많은 슬픔과 노동을 덜어 줬다.