无法使用SqlBulkCopy从Excel读取第一行

时间:2012-12-24 10:15:51

标签: c# asp.net .net sqlbulkcopy

我使用以下代码将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 个答案:

答案 0 :(得分:4)

即使我遇到同样的问题,这也是因为我正在使用如下的Read()方法。

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

解决上述问题是删除dr.Read()方法和while循环 使用 bulkcopy.WriteToServer(DR) 没有任何条件和Read()方法。

答案 1 :(得分:2)

可能的原因可能是您在连接字符串中指出第一行包含列名(HDR=YES),因此该行不会被视为包含数据。

修改

另一个可能的原因是在将阅读器传递给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);

答案 2 :(得分: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);
                }
            }