2010-10-27 73 views
3

我正在将Excel文件(仅约1000条记录)导入到专用的SQL Server数据库。因为我需要处理来自Excel的传入数据(每行添加一个GUID,进行一些数据转换),我希望逐行执行并且不想批量导入(尽管我对交易没有任何反应)。将Excel文件逐行导入到SQL Server

我很困惑如何正确地做到这一点。我可以用一个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(第二种方法)?我猜这对于有1000个插入SQL服务器是相当“愚蠢的”?
  2. dataAdapter.Update(myDataSet) < - 我应该在迭代所有Excel行或每行(如上面的示例代码所示)后执行该操作,这是否会奇迹般地创建事务?
  3. 我应该使用哪种方法?还有LINQ to SQL - 为什么不使用它(性能可能是因为另一层)?
  4. DataSet当读取Excel文件时发生某些错误时会发生什么 - 更新仍然推送到SQL服务器还是一切丢失?


简而言之:我想导入Excel文件到SQL Server行由行而制作上的数据变化要导入(我不希望使用SSIS包[因为除了数据转换之外,我对Excel文件做了很多工作,例如将其导入Sharepoint并解雇工作流]或BizTalk)
» »如何做到这一点?
最后我继续购买 Aspose Cells。 Aspose拥有一套非常优秀的工具。

+5

为什么你不想使用SSIS?如果该工具适合... – 2010-10-27 14:43:46

+0

因为我同时将Excel文件导入Sharepoint,并创建Infopath表单和任务并启动工作流程,所以不是简单地导入。与使用一些SSIS包(除了基本示例之外,我从来没有创建过这个包)相比,我更愿意“掌握代码”。 – 2010-10-27 14:54:54

+0

你的问题忽略提及新的信息....但它几乎肯定可能在SSIS ... – 2010-10-27 15:02:43

回答

4

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

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

+0

'SqlBulkCopy'听起来很有趣我会看看它 – 2010-10-27 15:04:36

1

给出你对问题的描述:“我想将Excel文件逐行导入到SQL服务器,同时对要导入的数据进行更改” - SSIS是完美工具。

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

+0

我编辑了这篇文章,并对之前的评论发表评论以阐明。这不像将某些Excel文件导入SQL Server那样简单,因为在导入过程中也会启动其他进程。我的问题更多地是了解不同方法之间的差异 – 2010-10-27 15:04:02

+0

SSIS不是在SQL和Excel之间交换数据的可靠方法。太多的错误。 – 2010-10-27 16:53:33

1

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

0

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

+0

是的,我可以做到这一点。但是,为什么我会?为什么不使用DataSets? – 2010-10-27 15:05:32

-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$] 
+1

如果您发布代码或XML,**请**在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码”按钮(101 010)以更好地格式化和语法突出显示它! – 2010-10-27 15:36:36

+0

我的不好感谢的输入 – Grant 2010-10-27 16:11:19