从DataTable批量插入到SQLCE DataSource

时间:2011-05-11 08:45:35

标签: c# wpf sql-server-ce bulkinsert

这是一个使用SQL CE作为DataSource的C#WPF应用程序:

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

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

我当前的方法是DROP TABLE,CREATE TABLE,并通过强力对SQLCE重新插入行。 SQL CE没有批量插入,我不想使用第三个库或DLL。表现很慢......

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

我读了一些关于SqlCeResultSet的内容,但我找不到任何文档,并且想知道它与我正在尝试做的事情有什么关系。

[编辑]
在回答并检查之后:
http://ruudvanderlinden.com/2010/10/13/bulk-insert-into-sql-ce-in-c/

我尝试使用该功能,但似乎没有用。 以下是我的代码。 Footable是我的数据库表,我有两列 - “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");

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

[编辑 - 第二次] [答案]
最后,我得到了代码(虽然对性能有疑问):

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");

3 个答案:

答案 0 :(得分:3)

您应该使用SqlCeResultSet Class

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

答案 1 :(得分:0)

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

答案 2 :(得分: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;
        }