2015-06-19 84 views
0

我試圖使用BulkInsert將數據從Excel電子表格添加到SQL Server中的表中。在線幫助非常好,但是我收到了一個我不明白的錯誤。OleDbDataReader - 沒有給出一個或多個所需參數的值

這裏是我使用來獲取和保存目標Excel文件(使用FileUpload控件)代碼:

protected void btnGetFile_click(object sender, EventArgs e) 
    { 
     if (this.FileUpload1.HasFile) 
     { 
      this.FileUpload1.SaveAs(Server.MapPath("~/temp/") + this.FileUpload1.FileName);  
      ImportFromExcel(Server.MapPath("~/temp/") + this.FileUpload1.FileName); 
     } 
    } 

這是我使用的讀取文件並執行代碼BULK INSERT:

public void ImportFromExcel(string excelFilePath) 
    { 
     // Get connection string to database from web.config 
     string strConnDB = ConfigurationManager.ConnectionStrings["strConnectToDB"].ConnectionString; 
     // Connection string for selected Excel file 
     string strConnExcel = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelFilePath + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"; 

     string strExcelBatchQuery = "select LabBatch from [LabBatch$]"; 

     OleDbConnection connExcel = new OleDbConnection(strConnExcel); 
     connExcel.Open(); 

     OleDbCommand cmdExcel = new OleDbCommand(strExcelBatchQuery, connExcel); 

     OleDbDataReader rdrExcel = cmdExcel.ExecuteReader(); 

     SqlBulkCopy bulkCopy = new SqlBulkCopy(strConnDB); 
     bulkCopy.DestinationTableName = "_trasher_excel_batch"; 

     while (rdrExcel.Read()) 
     { 
      bulkCopy.WriteToServer(rdrExcel); 
     } 
     connExcel.Close(); 
    } 

但當我嘗試這個代碼,我得到的錯誤,「System.Data.OleDb.OleDbException:沒有爲一個或多個必需的參數給定值。」在這條線上:

OleDbDataReader rdrExcel = cmdExcel.ExecuteReader(); 

我已經看遍了所有,但這似乎是正確的語法。即使是MSDN entry說這是正確的。

該表存在於我的數據庫中,並且我已經檢查了表,工作表和字段名稱。電子表格中沒有空值(對Stackoverflow上的類似帖子的一些回覆表示可能是問題)。

任何幫助?謝謝。

回答

1

對於任何人誰上臺後:

我發佈的SQL語法似乎與SELECT *工作,但不能與SELECT [某些字段。我不知道爲什麼,但如果您遇到同樣的問題,則可以導入Excel文件中的所有字段,然後編寫代碼以僅使用實際需要的數據。

我相信有更好的答案,這種解決方法讓我的老闆退縮。

1

你在你的SQL中指定了這個「[LabBatch $]」參數,但是你沒有爲它提供一個值。

編輯

private static void ShowExcelWorksheetNames(OleDbConnection m_connexcel, string Filepath) 
{ 
    try { 
     DataTable ExcelSheets = m_connexcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { 
      null, 
      null, 
      null, 
      "TABLE" 
     }); 
     foreach (DataRow row in ExcelSheets.Rows) { 
      MessageBox.Show(row.Item("TABLE_NAME")); 
     } 
    } catch (Exception ex) { 
     throw new Exception(ex.Message); 
    } 
} 
+0

謝謝您的答覆,但我不明白......在SQL語句,在Excel工作簿的標籤是LabBatch $和我想要的字段是LabBatch。你能給我一個正確格式的SQL字符串的例子嗎? – Stanton

+0

抱歉,遲到的回覆。現在我更仔細地看,你的SQL看起來很好。你似乎確定工作表名稱是正確的。也許列舉工作表名稱將會有所幫助。我編輯了將執行枚舉的答案。我希望這有助於幫助 –

+0

羅恩,再次感謝幫助我。在你第一次回覆之後,我修改了我的SQL,發現SELECT *有效,但是指定的字段沒有 - 不知道爲什麼。但是我已經開發了一種使用這種方法的解決方法。 – Stanton

0

在連接字符串中,您將「第一行是列名」(HDR)設置爲「NO」,因此選擇只能與「*」一起使用。

嘗試:

string strConnExcel = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelFilePath + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1';"; 
相關問題