【问题标题】:sqlbulkcopy using sql CE使用 sql CE 的 sqlbulkcopy
【发布时间】:2009-10-22 11:06:52
【问题描述】:

是否可以将 SqlBulkcopy 与 Sql Compact Edition 一起使用,例如(*.sdf) 文件?

我知道它适用于 SQL Server 200 Up,但想检查 CE 兼容性。

如果没有其他人知道在不使用 DataSets 的情况下将 CSV 类型文件导入 SQL Server CE 的最快方法吗?

【问题讨论】:

    标签: c# sql-server-ce sqlbulkcopy


    【解决方案1】:

    我这里有一个 SqlCeBulkCopy 库:http://sqlcebulkcopy.codeplex.com - 甚至支持 IEnumerable。

    【讨论】:

    • 是否支持 Visual Studio 2008?
    • 是的 - 这是一个 VS 2008 解决方案。
    • 要使用它,我是否必须将所有五个 .DLL 添加到我的项目中?或者只是其中一些?它们是“通用”SqlCe .DLL 的替代品,还是它们的补充?
    • 它们是附加的,你不需要复制ddl文件,它们只需要安装在PC/设备上。
    • 你的意思是DLL文件吗?那么所有五个都需要在路径上,还是作为对项目的引用添加?
    【解决方案2】:

    SQL CE 不支持 BULKCOPY。如果表中有大量行,这是最快的方法;插入太慢了!

    using (SqlCeConnection cn = new SqlCeConnection(yourConnectionString))
    {
        if (cn.State == ConnectionState.Closed)
            cn.Open();
    
        using (SqlCeCommand cmd = new SqlCeCommand())
        {
            cmd.Connection = cn;
            cmd.CommandText = "YourTableName";
            cmd.CommandType = CommandType.TableDirect;
    
            using (SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Updatable | ResultSetOptions.Scrollable))
            {
                SqlCeUpdatableRecord record = rs.CreateRecord();
    
                using (var sr = new System.IO.StreamReader(yourTextFilePath))
                {
                    string line;
                    while ((line = sr.ReadLine()) != null)
                    {
                        int index = 0;
                        string[] values = line.Split('\t');
    
                        //write these lines as many times as the number of columns in the table...
                        record.SetValue(index, values[index++] == "NULL" ? null : values[index - 1]);
                        record.SetValue(index, values[index++] == "NULL" ? null : values[index - 1]);
                        record.SetValue(index, values[index++] == "NULL" ? null : values[index - 1]);
    
                        rs.Insert(record);
                    }
                }
            }
        }
    }
    

    基准:34370 行的表

    • 插入:每秒写入 38 行

    • 这样:每秒写入 260 行

    【讨论】:

    • 此方法不支持 Identity 和 rowversion 列类型
    • 哇,正在努力插入并获得每秒 20 - 30 行,我敢肯定这只是在不到 1 秒的时间内完成了所有 35,774 行(我所有的数据都在内存中的数组中)所以从源头上没有瓶颈。
    • 我使用 SqlCeCommand 和参数将我的代码转换为这个,虽然速度不是 10 倍,但速度是原来的两倍,谢谢。
    • 我之前的代码尝试使用实体框架 5 插入(关闭更改跟踪和验证,最后只使用一个 savechanges 调用)和 sqlce,让它运行一个半小时后回来发现它仍在进行中,我杀死了应用程序!使用上面的插入部分重写,现在它在 27 秒内插入相同的 271,703 条记录!
    • 除非我不明白这一点(绝对可能),这似乎是从数据库中获取值(StreamReader 从“yourConnectionString”读取),然后将它们重新插入数据库...... ???
    【解决方案3】:

    这种操作可以增加很多。 为了使这个操作变得有用(我的意思是快速而且相当安全),你可以使用 CE DataAdapter。

    通过示例,不关心按键,下面列出的步骤可以帮助您:

    1. 确保源表和目标表具有相同的字段结构;
    2. 使用源数据库中的数据表克隆虚拟数据表(您的选择);
    3. 创建一个CE命令,表名为commandtext(TableDirect为commandtype);
    4. 从 CE 命令创建一个 CE 数据适配器;
    5. 从 CE dataapter 创建一个 CE commandbuilder;
    6. 将插入命令从 CE 命令生成器传递到 CE 数据适配器;
    7. 将“n”个批处理行从源数据表复制到目标数据表(克隆),执行如下操作:

      '... previous codes
      For Each currentRow In sourceTable.Rows
         'u can do RaiseEvent Processing(currentRow, totalRows) here with DoEvents
         If targetTable.Rows.Count < 100 Then
            targetTable.InportRow(currentRow)
            targetTable.Rows(targetTable.Rows.Count - 1).SetAdded
         Else
            '...Here you wll call the CE DataAdapter's Update method (da.Update(targetTable))
            '...and then be sure you clone the targetTable again, erasing all previous  rows.
            '...Do a clone again, don't do just a "clear" in the Rows collection.  
            '...If u have an Autoincrement it will break all Foreign Keys.
         End If
         Next
         '... next codes
      

    通过这种方式,您可以在没有太多时间的情况下更新多行。

    我有一些应用程序使用这种方法,在一个包含 5 个 NTEXT 字段(慢)和 800000 行的表中,平均速率约为每秒 1500 行。

    当然,这一切都取决于您的表格结构。 IMAGE 和 NTEXT 都是慢速数据类型。

    P.S.:正如我所说,这种方法不太关心密钥,所以要小心。

    【讨论】:

      【解决方案4】:

      不,我认为不支持SqlBulkCopy(请参阅MSDN)。也许将数据作为 xml 放入并在服务器上将其剥离? SQL/XML 在 2005/2008 年相当不错。

      您可能还想查看 table-value-parameters,但我怀疑 CE 是否支持这些。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-17
        • 2010-10-21
        • 2010-10-14
        相关资源
        最近更新 更多