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();
4

3 回答 3

5

即使我面临同样的问题,这是因为我使用了Read()如下方法。

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

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

于 2016-04-27T20:38:42.027 回答
3

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

编辑

另一个可能的原因是在将读取器传递给对象OleDbDataReader.Read()之前调用方法。MSDN 状态SqlBulkCopy

复制操作从阅读器中的下一个可用行开始。大多数情况下,读取器只是由 ExecuteReader 或类似调用返回,因此下一个可用行是第一行。

因此,在您的情况下,您不应该打电话OleDbdr.Read(),因为这会将读者带到第一行;你应该BulkCopy打电话Read(),它会从第一行开始读取。您的代码应该是:

OleDbdr = OleDbCmm.ExecuteReader();
SqlBulkCopy BulkCopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["connstring"].ToString());
BulkCopy.DestinationTableName = "TempTable";
BulkCopy.WriteToServer(OleDbdr);
于 2012-12-24T10:22:49.517 回答
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);
   }
}
于 2013-08-01T10:18:24.130 回答