2013-07-23 17 views
4

我的應用程序截斷了一個數據庫表,並用excel中的行填充它。Excel SqlBulkCopy在本地PC和應用程序服務器上的工作方式不同?

使用excel文件(2000行),下面的上傳代碼將所有行全部插入到我的本地pc(我的開發環境)中,並且它也在服務器上,所以我認爲我成功地完成了任務,

但是,然後用戶添加了10個新行到我的Excel中,並試圖上傳2010年行,但除了新增加的10行2000行被插入,所以使用該Excel文件與2010行,如果我從服務器數據庫上傳它表中填充了2000行,如果我使用我的工作環境上載它,最終表是2010行。

服務器和本地應用程序是完全一樣的。 我試圖格式化等也

編輯示例執行:文件MyRecords.xlsx位於我的桌面,我現在連接到使用

http://myserver/myapplication 

並上傳MyRecords.xlsx我的應用程序,然後檢查計數在數據庫中,它說2361條記錄,然後打開visual studio並運行我的應用程序(http://localhost:58029/)並上傳MyRecords.xlsx並再次檢查數據庫它說2362記錄。

編輯示例執行2:我的excel有2160行,如果我上傳它,它會從本地和服務器中插入2160行。如果我刪除了1000行並上傳,現在它按預期從本地和服務器插入1160行。現在,如果我重新添加這1000行並上傳excel,現在如果我使用本地環境進行了此過程,則它可以很好地插入2160行,如果是服務器,則插入1160行。因此,在服務器端沒有看到對excel的任何修改,所以你確定這是原因嗎? -

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我手動添加記錄到excel,它的工作方式類似於從服務器的sheet1中選擇top(2361),無論我做什麼,但對於同一個文件,它的工作原理是select * from sheet1。無法弄清楚。 – HOY

回答

1

我懷疑由GetOleDbSchemaTable返回的表沒有包含所有的數據。用戶是否在表格下方添加了行,而不是在表格內?

檢查由dbSchema.Rows[0]["TABLE_NAME"].ToString()返回的名稱是否指向表單或表名稱?

編輯:另外請確保用戶保存並正確上傳文件。比較Excel文件和數據庫以確保它們匹配。

How To Retrieve Schema Information by Using GetOleDbSchemaTable and Visual Basic .NET

+0

我不知道它在應用程序服務器中返回什麼,但在開發環境中,它返回「Sheet1 $」,這是第一個表的名稱。 – HOY

+0

如果它返回Sheet1 $,那麼它應該佔用整個工作表。他們保存了文件嗎?他們保存在本地還是保存在正確的位置? –

1

出現這種情況是因爲 「typeguessrow」 創先爭優的功能。 更改註冊表中設置從8 typeguessrow爲0

過程
1.型號REGEDIT.EXE上命令提示並搜索typeguessrow(按F3打開搜索)。
2.導出註冊表備份

Windows註冊表編輯器5.00版

[HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\辦公室\ 12.0 \ Access連接引擎\引擎\ EXCEL]
「DisabledExtensions」=「!XLS 「
」ImportMixedTypes「= 」文本「
」FirstRowHasNames「=十六進制: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. 導入註冊表
+0

我不認爲這是原因,這是一個發生。我的Excel有2160行,如果我上傳它,它會從本地和服務器插入2160行。如果我刪除了1000行並上傳,現在它按預期從本地和服務器插入1160行。現在,如果我重新添加這1000行並上傳excel,現在如果我使用本地環境進行了此過程,則它可以很好地插入2160行,如果是服務器,則插入1160行。因此,在服務器端沒有看到對excel的任何修改,所以你確定這是原因嗎? – HOY

+0

是的,因爲格式有變化。最有可能的日期。**「ImportMixedTypes」=「文本」**和**「TypeGuessRows」= dword:00000000 **日期列格式化爲日期將解決您的問題 – Icarus

相關問題