Массовая вставка из DataTable в SQLCE DataSource - PullRequest
2 голосов
/ 11 мая 2011

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

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

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

Мой текущий подход - DROP TABLE, CREATE TABLE и повторная вставка строк методом грубой силы в SQLCE.SQL CE не имеет массовой вставки, и я не хочу использовать третью библиотеку или DLL.Производительность медленная ...

Я ищу или более быстрый способ "массовой вставки" без необходимости отбрасывать, создавать и вставлять строки один за другим.

Я прочиталкое-что о SqlCeResultSet, но я не могу найти никакой документации и удивляюсь, имеет ли это какое-то отношение к тому, что я пытаюсь сделать.

[EDIT] После ответа и проверки этого: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");

Ответы [ 3 ]

3 голосов
/ 11 мая 2011

Вы должны использовать SqlCeResultSet Class

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

0 голосов
/ 10 февраля 2016

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

 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 голосов
/ 11 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...