Excel到SQL。 BulkCopy的替代方案?

时间:2011-03-25 11:21:44

标签: c# sql sqlbulkcopy

我有一段代码使用DataReader和SqlBulkCopy将数据从excel电子表格复制到MSSQL表。它工作正常,直到我在表上创建一个主键,现在它失败了。我首先删除SQL表的内容,然后再使用excel中的数据填充它。

由于它只是我移动的少量数据,我想知道是否有比使用BulkCopy更好的方法吗?

更新:下面是相关代码,我收到的错误是:  “数据源中String类型的给定值无法转换为指定目标列的float类型。”

using (OleDbConnection connection = new OleDbConnection(excelConnectionString))
            {
                connection.Open();
                OleDbCommand cmd = new OleDbCommand
                ("SELECT Name, Date, Amount FROM ExcelNamedRange", connection);

                using (OleDbDataReader dr = cmd.ExecuteReader())
                {
                    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnectionString))
                    {
                        bulkCopy.DestinationTableName = "SqlTable";
                        bulkCopy.WriteToServer(dr);

                    }
                }                 
            }

5 个答案:

答案 0 :(得分:3)

SqlBulkCopy自动映射字段。但是,由于您添加了一个主键,默认映射不再有效。

您必须设置ColumnMapping以明确告诉您的SqlBulkCopy对象如何映射字段。

对所有字段执行此操作,但主键除外(假设您在PK上使用标识)。

例如:

_bulkCopyEngine.ColumnMappings.Add("fieldname_from", "fieldname_to");

答案 1 :(得分:2)

创建主键,建议您执行域约束(这是一件好事)。

因此,您的实际问题您需要另一种方法来执行批量插入,您需要找出重复键的原因(精确)执行PK的原因。)

答案 2 :(得分:0)

BulkCopy应该可以正常工作,所以你的问题似乎是一个重复的键(错误信息是什么?)。您要么拥有错误的数据,要么您创建的主键太窄。

您还可以做的是首先将数据推送到临时表(没有键/索引等,只是一个普通表),然后使用更新(2008年时合并)语句将其放入实际表中。

GJ

答案 3 :(得分:0)

好吧,这似乎是一个完全不同的问题,年ExcelNamedRange中似乎有一个值不能被转换为SqlTable中的一个列。你能看到吗?也许除以0错误等?

还要确保列对齐。不确定SqlBulkCopy如何映射列,我认为它只是将NamedRange中的第一列放入SqlTale的第一列等。所以请确保它们;按正确的顺序排列。 (或者看看如果更改名称会发生​​什么)

答案 4 :(得分:-1)

BulkCopy是最快的方法,如何从C#向MSSQL插入数据。