从DataTable到SQLCE DataSource的大容量插入

问题描述 投票:2回答:4

这是一个以SQL CE作为数据源的C#WPF应用程序:

我有一个DataTable(显示为DataGrid)和一个SQL CE DataSource。我使用DataAdapter,DataSet和DataTable从SQL CE填充DataTable。然后将我的DataGrid绑定到DataTable。

我可能将行(> 10,000)行添加到我的DataTable中,并且可能在将所有更改一起传播到Sql CE DataSource之前进行了数据编辑。

我当前的方法是DROP TABLE,CREATE TABLE,并通过暴力破解SQLCE重新插入行。 SQL CE没有批量插入,并且我不想使用第3个库或dll。性能很慢...

我正在寻找一种更快的“批量插入”方式,而无需一个接一个地删除,创建和插入行。

我读了一些有关SqlCeResultSet的信息,但找不到任何文档,并且想知道它与我要执行的操作有什么关系。

[编辑]遵循答案并进行检查:http://ruudvanderlinden.com/2010/10/13/bulk-insert-into-sql-ce-in-c/

我尝试使用该功能,但似乎没有用。下面是我的代码。合适的是我的数据库表,我有两列-“ id”和“ FooName”。

Hashtable idHash = new Hashtable();
Hashtable fooNameHash = new Hashtable();
foreach(DataRow row in dt.Rows)
{
    idHash.Add("id",row["id"]);
    fooNameHash.Add("FooName",row["FooName"]);
}

List<Hashtable> colHashList = new List<Hashtable>();
colHashList.Add(idHash);
colHashList.Add(fooNameHash);

BulkInsertDatabase(colHashList, "FooTable");

没用,但是我在上面的代码中看不到任何问题,所以希望有人可以指出。。

[编辑-2nd] [答案]最终,我得到了可以工作的代码(尽管对性能有所怀疑):

List<Hashtable> colHashList = new List<Hashtable>();

Hashtable[] idHash = new Hashtable[dt.Rows.Count];
Hashtable[] fooNameHash = new Hashtable[dt.Rows.Count];

int i=0;
foreach(DataRow row in dt.Rows)
{
    idHash[i] = new Hashtable();
    idHash[i].Add("id", row["id"]);
    colHashList.Add(idHash[i]);

    fooNameHash[i] = new Hashtable();
    fooNameHash[i].Add("FooName", row["FooName"]);
    colHashList.Add(fooNameHash[i]);

    i++;
}

BulkInsertDatabase(colHashList, "FooTable");
c# wpf sql-server-ce bulkinsert
4个回答
3
投票

您应使用SqlCeResultSet Class

允许在SQL CE数据库中批量导入,我在10秒内导入了100000行看example


0
投票

您可以在我的批量插入库中使用C#源代码:http://sqlcebulkcopy.codeplex.com


0
投票

它的工作,试试这个。

 public bool CopyDataTableToTable(DataTable dataTable, string tableName, bool deleteTable)
        {
            Boolean returnValue = true;
            if (sqlCeConnection.State == ConnectionState.Closed)
                sqlCeConnection.Open();

            SqlCeTransaction transaction = sqlCeConnection.BeginTransaction();
            SqlCeCommand cmd = sqlCeConnection.CreateCommand();
            SqlCeResultSet rs = null;
            try
            {
                if (deleteTable)
                {
                    cmd.Transaction = transaction;
                    cmd.CommandText = "DELETE " + tableName;
                    cmd.ExecuteNonQuery();
                }

                cmd.CommandType = System.Data.CommandType.TableDirect;
                cmd.CommandText = tableName;
                rs = cmd.ExecuteResultSet(ResultSetOptions.Updatable);

                for (int i = 0; i < dataTable.Rows.Count; i++)
                {
                    SqlCeUpdatableRecord rec = rs.CreateRecord();
                    DataRow row = dataTable.Rows[i];
                    for (int k = 0; k < dataTable.Columns.Count - 1; k++)
                    {
                        rec.SetValue(k + 1, row[k]);
                    }
                    rs.Insert(rec);
                }
                transaction.Commit();
            }

            catch (Exception ex)
            {
                returnValue = false;
                transaction.Rollback();
            }
            finally
            {
                rs.Close();
                if (sqlCeConnection.State == ConnectionState.Open)
                    sqlCeConnection.Close();

            }
            return returnValue;
        }

0
投票

我尝试过您的解决方案,它在此行引发错误rec.SetValue(k + 1,row [k]);输入的字符串格式不正确。请问如何解决?

© www.soinside.com 2019 - 2024. All rights reserved.