2012-03-01 7 views
0

죄송합니다. Enghist가 좋지 않습니다! 테이블에 존재하는 행 (기존 확인되지 않음) 수입가져 오기 전에 asp.net의 SQL 서버에 파일을 가져 오려면 가져 오기 전에 테이블에있는 기존 레코드를 확인하십시오.

내 기능 작업도이 행을 가져 do'nt 경우,

string excelConnectionString = ""; 
    string strFileName = DateTime.Now.ToString("ddMMyyyy_HHmmss"); 
    string strFileType = System.IO.Path.GetExtension(fileuploadExcel.FileName).ToString().ToLower(); 
    fileuploadExcel.SaveAs(Server.MapPath("~/Import/" + strFileName + strFileType)); 
    string strNewPath = Server.MapPath("~/Import/" + strFileName + strFileType); 
    //Connection String to Excel Workbook 
    if (strFileType.Trim() == ".xls") 
    { 
     excelConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strNewPath + ";Extended Properties=Excel 8.0;Persist Security Info=False"; 
    } 
    else if (strFileType.Trim() == ".xlsx") 
    { 
     excelConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strNewPath + ";Extended Properties=Excel 12.0;Persist Security Info=False"; 
    } 

    //Create Connection to Excel work book 
    OleDbConnection excelConnection =new OleDbConnection(excelConnectionString); 
    //Create OleDbCommand to fetch data from Excel 
    OleDbCommand cmd = new OleDbCommand("Select [account_id], [type],[first_name], [last_name], [title], [birthday], [tel],[phone], [email_1],[email_2], [remark],[del_if] from [Sheet1$]",excelConnection); 
    excelConnection.Open(); 
    OleDbDataReader dReader; 
    dReader = cmd.ExecuteReader(); 
    SqlBulkCopy sqlBulk = new SqlBulkCopy(strConnection); 
    //Give your Destination table name 
    sqlBulk.DestinationTableName = "contact"; 

    sqlBulk.WriteToServer(dReader); 

답변

0

내가 알고하지 않습니다 엑셀 헛소리를 확인하는 방법

이것은 SqlBulkCopy를 사용하여 가능할 것입니다. 수행 할 수있는 작업은 스테이징 테이블에 데이터를 쓰고 이미 존재하지 않는 레코드를 복사하는 것입니다. 그런 다음 복사가 완료되면 준비 테이블을 지울 수 있습니다.

편집 :

을 감안할 때, 당신이 가능하게 데이터를 읽기 전에 당신의 "접촉"테이블에서 (아마도 귀하의 예제에서 ACCOUNT_ID) 키 값의 고유 한 목록을 찾을 수있는 준비 테이블을 사용하고자하지에 대한 의견 이 파일을 Excel에서 가져온 다음이 목록을 사용하여 Excel 파일에서 읽은 레코드를 제외하십시오. 이로 인해 얻을 필요가없는 Excel 파일에서 데이터를 읽지 않는 이점이 있습니다. 단점은 "연락처"테이블이 거대하거나 데이터를 비교하는 데 사용하는 키가 account_id와 같이 단순하지 않은 경우이 방법이 모두 효율적이지 않을 수 있다는 것입니다.

또 하나의 대안은 파일을 거들떠 보지 않으면 삽입에 where 절을 사용하여 레코드를 행 단위로 삽입하여 불필요한 중복을 만들지 않도록하는 것입니다. 이것은 SqlBulkCopy보다 현저히 느려지지만 작동 할 것입니다.

+0

SqlBulkCopy를 사용할 수없는 경우 다른 방법을 사용할 수 있습니다. 나는 단지 "수입 전에 점검"을 해결하기를 원합니다. 스테이징 테이블에 기록한 다음 이미 존재하지 않는 레코드를 다른 talbe에 복사하면 더 복잡해질 수도 있습니다. – Hainlp

+0

@ Hainlp- 편집 된 게시물에 몇 가지 대안이 있습니다. 나는 그들이 어떤 용도로 사용되기를 바랍니다. 행운을 빕니다. 주요 문제는 SqlBulkCopy가 선택적 삽입에 유용하지 않다는 것입니다. 가능한 한 빨리 데이터를 채 웁니다. 문제의 핵심은 먼저 데이터베이스에 저장해야하는 데이터를 필터링하거나 SqlBulkCopy를 사용하지 않는 것입니다. –

+0

@ Mrose Moose : 감사합니다. 내가 저장 프로 시저에 대해 더 읽고 SqlBulkCopy를 사용하지 않는 다른 방법을 가져올 필요가 있다고 생각합니다. 고마워하는 Mr Moose again :). – Hainlp

관련 문제