2012-12-24 76 views
3

我正在使用以下代碼將Excel文件更新到SQL Server中。代碼正在工作,但不能將第一行插入到表中。無法使用SqlBulkCopy從Excel中讀取第一行

OleDbConnection OleDb = new OleDbConnection(ConnectionString); 
OleDbCommand OleDbCmm = new OleDbCommand(Query,OleDb); 
OleDbDataReader OleDbdr; 
OleDb.Open(); 

if (OleDb.State == ConnectionState.Open) 
{ 
    OleDbdr = OleDbCmm.ExecuteReader(); 
    SqlBulkCopy BulkCopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["connstring"].ToString()); 
    BulkCopy.DestinationTableName = "TempTable"; 

    if (OleDbdr.Read()) 
    { 
     BulkCopy.WriteToServer(OleDbdr); 
    } 
} 

OleDb.Close(); 

回答

2

一個可能的原因可能是你在連接字符串中指出,第一行包含因此該行不被視爲包含數據的列名(HDR=YES)。

EDIT

另一個可能的原因是在調用OleDbDataReader.Read()方法使讀者SqlBulkCopy對象之前。 MSDN states

複製操作從閱讀器的下一個可用行開始。大多數時候,讀者只是由ExecuteReader或類似的調用返回,所以下一個可用行是第一行。

因此,在你的情況下,你不應該打電話給OleDbdr.Read(),因爲這會提高讀者到第一行;你應該讓BulkCopy呼叫Read(),它將開始從第一行讀取。 您的代碼應該是:

OleDbdr = OleDbCmm.ExecuteReader(); 
SqlBulkCopy BulkCopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["connstring"].ToString()); 
BulkCopy.DestinationTableName = "TempTable"; 
BulkCopy.WriteToServer(OleDbdr); 
+0

感謝您的回覆,但我使用以下連接字符串「Provider = Microsoft.Jet.OLEDB.4.0; Data Source ='」+ FilePath +「'; Jet OLEDB:Engine Type = 5; Extended Properties = \」Excel 8.0; HDR =否; IMEX = 1 \「」 – ravi

+0

@ravi,請看最新的編輯。 – RePierre

1

您需要設置標題爲Excel到SQL作爲我在

   string conn = "Provider=Microsoft.Jet.OLEDB.4.0;" + 
       "Data Source=" + Your D S+ ";" + 
       "Extended Properties=Excel 8.0;"; 

       OleDbConnection sSourceConnection = new OleDbConnection(conn); 

       using (sSourceConnection) 
       { 
       DataTable dtExcelData = new DataTable(); 
       string[] SheetNames = GetExcelSheetNames(strFileName); 

       string[] preColumnHeader = new string[]{ "CarrierId", "StateId", "TerrCd", "ProgramId", "ClassId", 
       "PremTypeID","Limit50_100", "Limit100_100", "Limit100_200", "Limit300_300", "Limit300_600", 
       "Limit500_500","Limit500_1mil", "Limit1mil_1mil", "Limit1mil_2mil", "OtherParameter" }; 

       sSourceConnection.Open(); 
       string strQuery = string.Empty; 
       strQuery = "SELECT * FROM [" + SheetNames[0] + "]"; 

       OleDbDataAdapter oleDA = new OleDbDataAdapter(strQuery, sSourceConnection); 
       oleDA.Fill(dtExcelData); 

       sSourceConnection.Close(); 
       string[] colName = new string[dtExcelData.Columns.Count]; 
       int i = 0; 
       foreach (DataColumn dc in dtExcelData.Columns) 
       { 
        colName[i] = dc.ColumnName; 
        i++; 
       } 



       using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connStr)) 
       { 
        bulkCopy.DestinationTableName = "tbl_test"; 
        bulkCopy.WriteToServer(dtExcelData); 
       } 
      } 
3

連我都面臨着同樣的問題,這樣做是因爲我用讀( )方法如下。

  while (dr.Read()) 
      { 
       bulkcopy.WriteToServer(dr); 
      } 

解決上述問題是除去dr.Read()方法和while循環 使用 bulkcopy.WriteToServer(DR) 無任何條件和read()方法。

相關問題