Excel SqlBulkCopy는 로컬 PC 및 응용 프로그램 서버에서 다르게 작동합니까?

c# excel oledbconnection sqlbulkcopy

문제

내 응용 프로그램은 데이터베이스 테이블을 잘라내어 Excel의 행으로 채 웁니다.

엑셀 파일 (2000 행)을 사용하면 업로드 코드 아래에 모든 행이 내 로컬 PC (내 개발 환경)에 완전히 삽입되고 서버에서도 수행되므로 성공적으로 작업을 완료했다고 생각합니다.

하지만 그때 사용자가 내 엑셀에 10 개의 새로운 행을 추가하고 2010 행을 새로 고치려고했지만 새로 추가 된 10 개의 행을 제외하고 2000 행이 삽입되었으므로 2010 행의 Excel 파일을 사용하여 2000로 채워진 서버 데이터베이스 테이블에서 업로드하면 행, 그리고 만약 내 작업 환경을 사용하여 업로드 최종 테이블 2010 행입니다.

서버 및 로컬 응용 프로그램은 완전히 동일합니다. 나는 포맷팅 등도 시도했다.

예제 편집 실행 : MyRecords.xlsx 파일이 내 바탕 화면에 있습니다. 이제 내 응용 프로그램에 연결합니다.

http://myserver/myapplication

MyRecords.xlsx를 업로드 한 다음 데이터베이스에서 수를 확인하면 2361 개의 레코드가 표시되고 Visual Studio를 열고 내 응용 프로그램 ( http://localhost:58029/ )을 실행하고 MyRecords.xlsx를 업로드하고 데이터베이스에 2362 개의 레코드가 있는지 다시 확인하십시오.

편집 예제 실행 2 : Excel에는 2160 개의 행이 있습니다. 업로드하면 로컬과 서버 모두에서 2160 개의 행이 삽입됩니다. 내가 1000,000 라인을 제거하고 그것을 업로드하면, 지금은 예상대로 로컬과 서버에서 1160 라인을 삽입합니다. 이제이 1000 줄을 다시 추가하고 Excel을 업로드하면 로컬 환경을 사용하여이 프로세스를 수행하면 2160 줄이 삽입되고 서버가 1160 줄 삽입됩니다. 따라서 서버 측에서 엑셀 수정 사항을 볼 수 없으므로 이것이 확실한 이유입니까? â € "

    private void UploadData(string path, string dbTableName)
    {
        //Create connection string to Excel work book
        string excelConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";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

        excelConnection.Open();
        DataTable dbSchema = excelConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); //Get First Sheet Name
        OleDbCommand cmd = new OleDbCommand("Select * from [" + dbSchema.Rows[0]["TABLE_NAME"].ToString() + "]", excelConnection);

        OleDbDataReader dReader;
        dReader = cmd.ExecuteReader();
        SqlBulkCopy sqlBulk = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["MyDbConn"].ConnectionString);

        //Give your Destination table name
        sqlBulk.DestinationTableName = dbTableName;

        try
        {
            sqlBulk.WriteToServer(dReader);
            if(dbTableName == "TempTP")
            {
                SDatabaseManagerData.DatabaseManagerData.UpdateTP();
            }

            lbl_Error.Visible = true;
            lbl_Error.Text = "Database updated!";

        }
        catch (SqlException ex)
        {
            lbl_Error.Visible = true;
            lbl_Error.Text = "Database updated edilemedi! Hata: " + ex.Message;
        }

        excelConnection.Close();
    }

인기 답변

이것은 Excel의 "typeguessrow"기능으로 인해 발생합니다. 레지스트리를 변경하면 typeguessrow가 8에서 0으로 설정됩니다.

방법
1. 명령 프롬프트에서 regedit.exe 를 입력하고 typeguessrow를 검색 하십시오 (검색을 열려면 F3 키를 누르십시오).
2. 백업으로 레지스트리 내보내기

Windows 레지스트리 편집기 버전 5.00

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Office \ 12.0 \ Access 연결 엔진 \ 엔진 \ Excel]
"DisabledExtensions"= "! xls"
"ImportMixedTypes"= "텍스트"
"FirstRowHasNames"= 16 진수 : 01
"AppendBlankRows"= dword : 00000001
"TypeGuessRows"= dword : 00000008
"win32"= "C : \ PROGRA ~ 1 \ COMMON ~ 1 \ MICROS ~ 1 \ OFFICE12 \ ACEEXCL.DLL"

  1. "TypeGuessRows"= dword : 00000008"TypeGuessRows"= dword : 00000000으로 변경하십시오.
  2. 레지스트리 가져 오기


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