2012-12-24 126 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()方法。

相关问题