SQL Server Compact快速插入数据信息? C#

时间:2012-01-11 00:03:37

标签: sql sql-server-ce

我正在使用SQL Server Compact Edition。

我有一个FOR循环来构建我的查询以插入数据,所以我从一个完整的SQL Server下载3000行。

我需要将这3000行插入到SQL Server Compact Edition中,目前我为每一行都插入一个需要大量时间的插入。我需要为12个表做这个,这需要很长时间......我需要一个更快的方法在不到5分钟内完成这个...

你知道在SQL Server Compact上插入大量行的方法吗?

我尝试在五十岁时插入五十,但我得到了一个错误......

insert into table(col1,col2) 
values (val1,valo2) ; 
insert into table(col1,col2) 
values (val1,valo2) 

我在2次插入时出错(因此无法进行50次插入),

是否可以在SQL Server Compact Edition中执行OPENROWSET

我的问题
如何在SQL Server Compact Edition数据库中插入大量行? 我从一个完整的SQL Server数据库中获取这些数据。

2 个答案:

答案 0 :(得分:3)

  

你知道在sql compact上插入很多行的方法吗?

请参阅下面的我认为最佳解决方案,但如果您不喜欢它(无论出于何种原因)您的源数据库是SQL Server,您可以考虑在SQL中创建链接服务器服务器到您的压缩数据库并让SQL Server插入记录。根据我的经验,SQL Server很快就会插入到任意数据库中。

SQL Compact Bulk Insert Library

  

.NET库,用于快速(执行批量插入)将数据加载到SQL Server Compact数据库文件中。尝试模仿SQLClient SqlBulkCopy API。

     

测试的一些时间 - 加载2列表而没有约束/索引:

     

1,000,000行:6秒= 166,666行/秒
  5,000,000行:28秒= 178,000行/秒

private static void DoBulkCopy(bool keepNulls, IDataReader reader)
{
    SqlCeBulkCopyOptions options = new SqlCeBulkCopyOptions();
    if (keepNulls)
    {
        options = options |= SqlCeBulkCopyOptions.KeepNulls;
    }
    using (SqlCeBulkCopy bc = new SqlCeBulkCopy(connectionString, options))
    {
        bc.DestinationTableName = "tblDoctor";
        bc.WriteToServer(reader);
    }
}

答案 1 :(得分:1)

使用纯SQL语句将12行插入12个表应该不到一秒钟。如果您遇到错误,或者需要几分钟,那么您做错了什么。这是一项非常基本的任务,如果您遇到错误,应该找出问题所在,不要尝试使用不同的工具。

使用C#将记录插入SQL CE数据库的最简单方法是使用ADO.NET。以下是使用参数化查询的示例:

using (var conn = new SqlCeConnection(YourCommandString))
{
    var cmd = conn.CreateCommand();
    cmd.CommandText = "INSERT INTO table (col1,col2) VALUES (@val1,@val2)";

    var param1 = cmd.CreateParameter();
    param1.ParameterName = "@val1";
    // assign col1 types, constraints, lengths here.
    cmd.Parameters.Add(param1);

    var param2 = cmd.CreateParameter();
    param2.ParameterName = "@val2";
    // assign col2 types, constraints, lengths here.
    cmd.Parameters.Add(param2);

    cmd.Prepare();
    conn.Open();
    foreach (var s in sourceDataStructure)
    {
        param1.Value = s.sourceValue1;
        param2.Value = s.sourceValue2;
        cmd.ExecuteNonQuery();
    }

    cmd.Dispose();
}

如果你不知道参数化查询是什么,你应该学习。