Массовая вставка из DataTable в SQLCE DataSource

Это приложение C # WPF с SQL CE в качестве источника данных:

У меня есть DataTable (отображается как DataGrid) и источник данных SQL CE. Я заполняю свой DataTable из SQL CE с помощью DataAdapter, DataSet и DataTable. Затем привяжите мой DataGrid к DataTable.

Я могу добавлять строки (> 10 000) строк в свой DataTable и, возможно, отредактировать данные, прежде чем распространять все мои изменения вместе в мой источник данных Sql CE.

Мой текущий подход - это DROP TABLE, CREATE TABLE и повторная INSERT строки с помощью грубой силы до 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");

Это не сработало, но я не вижу никаких проблем в приведенном выше коде, поэтому надеюсь, что кто-то сможет указать на это ...

[РЕДАКТИРОВАТЬ - 2-й] [ОТВЕТ]
Наконец, я заставил код работать (хотя производительность сомнительна):

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

person KMC    schedule 11.05.2011    source источник
comment
С вашими ›10 000 записями, состоит ли он из обновленных и новых записей? Или только что добавленные записи?   -  person Peyton Crow    schedule 11.05.2011
comment
@Peyton Crow - записи состоят как из обновленных, так и из новых записей. Но перед вставкой я буду УДАЛИТЬ, СОЗДАТЬ и пустую таблицу в SQL CE. Следовательно, я все равно буду рассматривать все записи DataTable как недавно добавленные.   -  person KMC    schedule 11.05.2011


Ответы (3)


Вам следует использовать класс SqlCeResultSet < / а>

это позволяет массовый импорт в базу данных SQL CE. Я импортировал 100000 строк за 10 секунд. Посмотрите на пример

person Serghei    schedule 11.05.2011
comment
Я отредактировал свой код. У вас сработало руководство или как вы заставили его работать? - person KMC; 11.05.2011
comment
Я нашел статью, из которой копирую код для своей программы, вы можете использовать примеры из этой статьи для реализации массовой вставки msdn.microsoft.com/en-us/library/ - person Serghei; 15.05.2011

Вы можете использовать исходный код C # из моей библиотеки массовой вставки здесь: http://sqlcebulkcopy.codeplex.com

person ErikEJ    schedule 11.05.2011
comment
Я не вижу исходного кода. Просто загружаемые библиотеки для всех разных версий. - person kingchris; 16.09.2015
comment
Ах, неловкий момент № 56. Спасибо. - person kingchris; 22.09.2015

его работа, попробуйте это.

 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;
        }
person mesutpiskin    schedule 10.02.2016