【问题标题】:Import Excel file to SQL Server row-by-row将 Excel 文件逐行导入 SQL Server
【发布时间】:2011-05-01 08:56:45
【问题描述】:

我正在将一个 Excel 文件(仅大约 1000 条记录)导入专用的 SQL Server 数据库。由于我需要处理来自 Excel 的传入数据(每行添加一个 GUID,一些数据转换),我想逐行进行并且不想批量导入(不过,我对交易没有任何意见)。

我对如何正确执行此操作感到困惑。我可以使用带有如下参数的SQLCommand

SqlCommand sqlCommand = new SqlCommand("insert into TestTable(GUID,Name,Pricing) values(@GUID,@Name,@Pricing)", sqlConn);
foreach (DataRow dr in ds.Tables[0].Rows) //<-- this is my Excel file to iterate through
{
 sqlCommander.Parameters.Clear();
 String refGUID = Guid.NewGuid().ToString();
 sqlCommander.Parameters.AddWithValue("GUID", refGUID);
 sqlCommander.Parameters.AddWithValue("Name", dr.ItemArray[0]);
 sqlCommander.Parameters.AddWithValue("Pricing", dr.ItemArray[1]);
 sqlCommander.ExecuteNonQuery();
}

或者我可以像这样使用“连接”模式:

SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT GUID, Name, Pricing FROM TestTable", sqlConn);
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);

DataSet myDataSet = new DataSet();
dataAdapter.Fill(myDataSet, "TestTable");
foreach (DataRow dr in ds.Tables[0].Rows) //<-- this is my Excel file to iterate through
{
 DataRow row = myDataSet.Tables[0].NewRow();
 row["GUID"] = refGUID;
 row["Name"] = dr.ItemArray[0];
 row["Pricing"] = dr.ItemArray[1];
 myDataSet.Tables[0].Rows.Add(row);
 dataAdapter.Update(myDataSet);
}

现在我的问题如下:

  1. 是为每一行发送一个INSERT 命令更好(这将是SqlCommand 方法)还是填充一个特殊的DataSet(第二种方法)更好?我想在 SQL 服务器中插入 1000 次是相当“愚蠢”的?
  2. dataAdapter.Update(myDataSet)
  3. 我应该使用哪种方法? 还有 LINQ to SQL - 为什么不使用它(性能可能,因为另一层)?
  4. 当读取 Excel 文件时出现一些错误时,DataSet 会发生什么 - 更新仍然推送到 SQL 服务器还是所有内容都丢失了?


简而言之:我想将 Excel 文件逐行导入 SQL 服务器,同时对要导入的数据进行更改(而且我不想使用 SSIS 包 [因为除了数据转换 我正在使用 Excel 文件做更多的事情,例如将其导入 Sharepoint 并触发 Workflows] 或 BizTalk)
»» 如何完美地做到这一点?
最后我继续买了Aspose Cells。 Aspose 有一套非常好的工具供他们使用。

【问题讨论】:

  • 为什么不想使用 SSIS?如果工具适合...
  • 因为我同时将 Excel 文件导入 Sharepoint,并创建 Infopath 表单和任务并启动工作流,所以它不仅仅是导入。与使用一些 SSIS 包(除了基本示例之外我从未创建过)相比,我也更乐于“处理代码”。
  • 您的问题忽略了提及新信息......但在 SSIS 中几乎可以肯定......
  • 我编辑了问题以包含该信息。我正在从 Sharepoint 触发代码,因此我认为将 SSIS 包部署到 SQL 服务器并从 Sharepoint 调用该包并不是那么聪明。是的,即使没有包含这些信息,但我主要想了解数据连接之间的差异,以找出最佳方法。

标签: c# sql-server dataset dataadapter import-from-excel


【解决方案1】:

您提到不想使用 SSIS - 但您是否考虑过 SqlBulkCopy?那么除了 .NET 之外不需要任何东西,但您仍然可以使用最快/最直接的导入。

这将接受 DataTable,因此您可以在 DataTable 中准备数据,然后扣动扳机。事务可选地支持 IIRC。对于更大的数据,您还可以实现 IDataReader 以提供完全流式上传(同时仍在处理传输中的每一行)。

【讨论】:

  • SqlBulkCopy 听起来很有趣,我去看看
【解决方案2】:

鉴于您对问题的描述:“我想将 Excel 文件逐行导入 SQL 服务器,同时对要导入的数据进行更改”- SSIS 是完成这项工作的完美工具。

Importing Excel data with SQL Server Integration Services SSIS with unicode and non-unicode data issues

【讨论】:

  • 我编辑了帖子并评论了您之前的评论以澄清。这并不像将一些 Excel 文件导入 SQL Server 那样简单,因为在导入过程中也会启动其他进程。我的问题更多是关于理解不同方法之间的差异
  • SSIS 不是在 SQL 和 Excel 之间交换数据的可靠方式。错误太多。
【解决方案3】:

dataSet 可能最终会将 INSERT 语句发送到服务器,所以在我看来,最好只发送 INSERT 语句而不发送 DataSet。您还可以对流程进行更多控制,例如检查单个行的错误、日志记录等。

【讨论】:

    【解决方案4】:

    您可以将处理后的数据表转换为 XML 并将其传递给 Sql server 中的存储过程(在一个查询中),然后让您的存储过程解析 XML 以创建记录。

    【讨论】:

    • 是的,我能做到。但我为什么要?为什么不使用数据集?
    【解决方案5】:
    INSERT INTO [dbo].[TableName]
               ([ColumnName1]
               ,[ColumnName2])
    )
    SELECT [ColumnName1]
               ,[ColumnName2]
    
    FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0','Data Source= PathToFile.xls;Extended Properties=Excel 8.0')...[Sheet1$]
    

    【讨论】:

    • 如果您发布代码或 XML,在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码”按钮 (101 010) 以很好地格式化和语法高亮!
    猜你喜欢
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    相关资源
    最近更新 更多