3

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

我对如何正确地做到这一点感到困惑。我可以使用SQLCommandwith 参数,如下所示:

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)<-- 我应该在遍历所有 Excel 行还是为每一行(如上面的示例代码所示)之后这样做,这会神奇地创建一个事务吗?
  3. 我应该使用哪种方法?还有 LINQ to SQL - 为什么不使用它(性能可能,因为另一层)?
  4. DataSet读取 Excel 文件时发生错误时会发生什么 - 更新仍然推送到 SQL 服务器还是所有内容都丢失了?


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

4

5 回答 5

4

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

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

于 2010-10-27T14:52:50.393 回答
1

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

使用带有 unicode 和非 unicode 数据问题的 SQL Server Integration Services SSIS 导入 Excel 数据

于 2010-10-27T14:51:55.797 回答
1

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

于 2010-10-27T14:54:52.743 回答
0

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

于 2010-10-27T14:54:57.957 回答
-1
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$]
于 2010-10-27T14:59:22.947 回答