OleDbDataAdapter.Update返回行,但没有行添加到Excel电子表格

我可以一行一行地将行添加到Excel电子表格中,但速度却非常慢(对于400条logging,即使使用Prepare,也只需要1分钟)。 所以,我知道Sql是有效的,DataTable是好的。

代码工作:

public void InsertFromDataTable(string strSql, DataTable dtTable, string strTableName) { if (m_oleDbHandler == null) { m_oleDbHandler = new OleDbHandler(m_strConnection); } //Do one row at a time since the DataAdapter did not work foreach (DataRow drRow in dtTable.Rows) { OleDbParmCollection cololedbParameters = new OleDbParmCollection(); foreach (DataColumn dcColumn in dtTable.Columns) { OleDbParameter odpParameter = new OleDbParameter("@" + dcColumn.ColumnName, drRow[dcColumn.ColumnName]); odpParameter.ParameterName = "@" + dcColumn.ColumnName; odpParameter.DbType = OleDbHandler.GetDbType(dcColumn.GetType()); odpParameter.Size = dcColumn.MaxLength; odpParameter.SourceColumn = dcColumn.ColumnName; cololedbParameters.Add(odpParameter); } m_oleDbHandler.ExecuteCommand(strSql, cololedbParameters, true); } } } 

当我尝试使用DataAdapter来做同样的事情时,它说它返回了458行,但电子表格中没有新行。 代码失败:

  //DataAdapter version OleDbParmCollection cololedbParameters = new OleDbParmCollection(); foreach (DataColumn dcColumn in dtTable.Columns) { OleDbParameter odpParameter = new OleDbParameter(); odpParameter.ParameterName = "@" + dcColumn.ColumnName; odpParameter.OleDbType = OleDbHandler.GetOleDbType(dcColumn.GetType()); odpParameter.DbType = OleDbHandler.GetDbType(dcColumn.GetType()); odpParameter.Size = dcColumn.MaxLength; odpParameter.SourceColumn = dcColumn.ColumnName; cololedbParameters.Add(odpParameter); } m_oleDbHandler.InsertFromDataTable(strSql, dtTable, cololedbParameters, strTableName); 

接着:

  public int InsertFromDataTable(string strSql, DataTable dtTable, OleDbParmCollection cololeDbParameters, string strTableName) { //Set every row as added so that they will be inserted foreach (DataRow drRow in dtTable.Rows) { drRow.SetAdded(); } //Update the output table int intRows = -1; try { OleDbCommand oleDbCommand = new OleDbCommand(strSql, OpenConnection()); foreach (OleDbParameter oleDbParameter in cololeDbParameters) { if (oleDbParameter.Value == null) { oleDbCommand.Parameters.Add(oleDbParameter.ParameterName, OleDbType.VarChar).Value = DBNull.Value; } else if (string.IsNullOrEmpty(oleDbParameter.Value.ToString())) { oleDbCommand.Parameters.Add(oleDbParameter.ParameterName, OleDbType.VarChar).Value = DBNull.Value; } else { oleDbCommand.Parameters.Add(oleDbParameter); } } OleDbDataAdapter odaAdapter = new OleDbDataAdapter(new OleDbCommand("SELECT * FROM " + strTableName, OpenConnection())); odaAdapter.InsertCommand = oleDbCommand; odaAdapter.MissingMappingAction = MissingMappingAction.Passthrough; odaAdapter.MissingSchemaAction = MissingSchemaAction.Error; odaAdapter.TableMappings.Add(strTableName, dtTable.TableName); foreach (DataColumn dcColumn in dtTable.Columns) { odaAdapter.TableMappings[0].ColumnMappings.Add(dcColumn.ColumnName, dcColumn.ColumnName); } intRows = odaAdapter.Update(dtTable); } catch (OleDbException ex) { LogStackTrace(); LogToDb.LogException(ex, LogToDb.c_strAppError); LogToDb.LogMessage("OleDb error", "OleDbHandler.InsertFromDataTable error", strSql, LogToDb.c_intErrorLevelOleDb); CancelTransactionAndClose(); throw; } finally { CloseConnection(); } return (intRows); } 

为什么我会得到intRows = 458,但Excel文件中没有新行?

编辑:我只是做了一个testing,看看会发生什么,如果我导出到Microsoft Access .mdb(而不是Excel),结果告诉我的东西。 我得到458空白行。 所以,我怀疑我在Excel中得到了458个空行。 所以,现在的问题是为什么行都是空白的。

明白了 – 错误在下面的部分。 这对于ExecuteNonQuery很有效,但在没有数据的时候很糟糕。

  foreach (OleDbParameter oleDbParameter in cololeDbParameters) { if (oleDbParameter.Value == null) { oleDbCommand.Parameters.Add(oleDbParameter.ParameterName, OleDbType.VarChar).Value = DBNull.Value; } else if (string.IsNullOrEmpty(oleDbParameter.Value.ToString())) { oleDbCommand.Parameters.Add(oleDbParameter.ParameterName, OleDbType.VarChar).Value = DBNull.Value; } else { oleDbCommand.Parameters.Add(oleDbParameter); } } 

与Access和Excel一起使用的正确的代码是:

  foreach (OleDbParameter oleDbParameter in cololeDbParameters) { oleDbCommand.Parameters.Add(oleDbParameter); } 

还有一个不太严重的错误。 我用了

 OleDbHandler.GetOleDbType(dcColumn.GetType()); 

应该是

 OleDbHandler.GetOleDbType(dcColumn.DataType);