Объединение двух файлов базы данных SQLite (C # .NET) - PullRequest
6 голосов
/ 28 декабря 2010

Я использую C # / .NET с оболочкой C # для SQLite. Я пытаюсь объединить две базы данных SQLite вместе, исключая дубликаты.

Я нашел это, на которое ссылаются несколько разных вопросов на форуме. http://old.nabble.com/Attempting-to-merge-large-databases-td18131366.html

Я пробовал приведенные ниже запросы, которые я структурировал по предоставленной мной ссылке, но они приводят к исключениям, базы данных вообще не объединяются и исходная база данных вообще не изменяется.

attach 'c:\test\b.db3' as toMerge;   
insert into AuditRecords select * from toMerge.AuditRecords; 

Вот мой код запроса.

public void importData(String fileLoc)
    {
        SQLiteTransaction trans;
        string SQL = "ATTACH '" + fileLoc + "' AS TOMERGE";
        SQLiteCommand cmd = new SQLiteCommand(SQL);
        cmd.Connection = connection;
        connection.Open();
        trans = connection.BeginTransaction();
        int retval = 0;
        try
        {
            retval = cmd.ExecuteNonQuery();
        }
        catch (Exception)
        {
            trans.Rollback();
            MessageBox.Show("An error occurred, your import was not completed.");
        }
        finally
        {
            trans.Commit();
            cmd.Dispose();
            connection.Close();
        }

        SQL = "INSERT INTO SUBCONTRACTOR SELECT * FROM TOMERGE.SUBCONTRACTOR";
        cmd = new SQLiteCommand(SQL);
        cmd.Connection = connection;
        connection.Open();
        trans = connection.BeginTransaction();
        retval = 0;
        try
        {
            retval = cmd.ExecuteNonQuery();
        }
        catch (Exception)
        {
            trans.Rollback();
            MessageBox.Show("An error occurred, your import was not completed.");
        }
        finally
        {
            trans.Commit();
            cmd.Dispose();
            connection.Close();
        }
    }

У меня вопрос: что я делаю не так? И кто-нибудь знаком с командой вставки? Я не уверен, если это исключит дубликаты, как мне нужно.

1 Ответ

10 голосов
/ 28 декабря 2010

Когда вы присоединяете базу данных в SQLite, вам необходимо выполнить каждый оператор (вставка, обновление, удаление) в одном соединении / транзакции. Не закрывайте соединение между ними. Это должно быть завершено в одной транзакции.

попробуйте это

public void importData(String fileLoc)
        {
            string SQL = "ATTACH '" + fileLoc + "' AS TOMERGE";
            SQLiteCommand cmd = new SQLiteCommand(SQL);
            cmd.Connection = connection;
            connection.Open();
            int retval = 0;
            try
            {
                retval = cmd.ExecuteNonQuery();
            }
            catch (Exception)
            {
                MessageBox.Show("An error occurred, your import was not completed.");
            }
            finally
            {
                cmd.Dispose();
            }

            SQL = "INSERT INTO SUBCONTRACTOR SELECT * FROM TOMERGE.SUBCONTRACTOR";
            cmd = new SQLiteCommand(SQL);
            cmd.Connection = connection;
            retval = 0;
            try
            {
                retval = cmd.ExecuteNonQuery();
            }
            catch (Exception)
            {
                MessageBox.Show("An error occurred, your import was not completed.");
            }
            finally
            {
                cmd.Dispose();
                connection.Close();
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...