2013-07-23 4 views
4

내 응용 프로그램은 데이터베이스 테이블을 잘라내어 Excel의 행으로 채 웁니다.Excel SqlBulkCopy는 로컬 PC 및 응용 프로그램 서버에서 다르게 작동합니까?

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

그러나 사용자가 내 Excel에 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 : 내 엑셀 내가 그것을 업로드 할 경우, 로컬 및 서버 모두에서 2160 선을 삽입, 2160 선이있다. 내가 1000,000 라인을 제거하고 그것을 업로드하면, 지금은 예상대로 로컬과 서버에서 1160 라인을 삽입합니다. 이제이 1000 라인을 다시 추가하고 엑셀을 업로드하면 로컬 환경을 사용하여이 프로세스를 수행하면 서버가 1160 라인이 삽입 된 경우 2160 라인이 제대로 작동합니다. 따라서 서버 측에서 엑셀 수정 사항을 볼 수 없으므로 이것이 확실한 이유입니까? -

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(); 
    } 
+0

dbSchema.Rows [0] [ "TABLE_NAME"]에서 어떤 이름이 반환됩니까? ToString()? –

+0

파일에 추가 된 레코드가 있는지 확인하십시오. 그 문제는 여기있는 코드가 아니라 사용자가 레코드를 추가하고 올바르게 저장하거나 업로드하지 않았다고 의심됩니다. 그것을 확인할 수 있습니까? –

+0

@D_Bester 수동으로 엑셀에 레코드를 추가하고 있는데, 서버의 sheet1에서 최상위 (2361)을 선택하는 것처럼 작동하지만, 동일한 파일의 경우 select *에서 작동합니다. 아직도 알아낼 수 없었다. – HOY

답변