使用SqlBulkCopy无法读取Excel中的第一行数据

5

我正在使用以下代码将Excel文件更新到SQL Server。代码可以正常工作,但无法将第一行插入表中。

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();
3个回答

5

我曾经也遇到同样的问题,这是因为我使用了以下方式的Read()方法。

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

解决以上问题的方法是删除dr.Read()方法和while循环,改为使用bulkcopy.WriteToServer(dr)而不需要任何条件和Read()方法。

3
可能的原因之一是您在连接字符串中指示第一行包含列名(HDR=YES),因此该行不被视为包含数据。
编辑
另一个可能的原因是在将读取器传递给SqlBulkCopy对象之前调用了OleDbDataReader.Read()方法。MSDN声明
复制操作从读取器中的下一个可用行开始。大多数情况下,读取器刚刚由ExecuteReader或类似的调用返回,因此下一个可用行是第一行。
因此,在您的情况下,您不应调用OleDbdr.Read(),因为这会将读取器提前到第一行;您应该让BulkCopy 调用Read()并从第一行开始读取。 您的代码应该是:
OleDbdr = OleDbCmm.ExecuteReader();
SqlBulkCopy BulkCopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["connstring"].ToString());
BulkCopy.DestinationTableName = "TempTable";
BulkCopy.WriteToServer(OleDbdr);

谢谢您的回复,不过我正在使用以下连接字符串:"Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + FilePath + "'; Jet OLEDB:Engine Type=5;Extended Properties="Excel 8.0;HDR=No;IMEX=1"" - ravi

1

您需要为 Excel to 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);
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接