合并两个SQLite数据库文件(C#.NET)

COD*_*ODe 6 .net c# sqlite merge

我正在使用C#/ .NET和SQLite的C#包装器.我正在尝试将两个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; 
Run Code Online (Sandbox Code Playgroud)

这是我的查询代码.

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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是,我做错了什么?是否有人熟悉insert命令?我不确定它是否会根据需要排除重复项.

Bin*_*nil 11

在SQLite中附加数据库时,需要在单个Connection/Transaction中执行每个语句(无论是插入,更新,删除).不要在两者之间关闭连接.它应该在单个交易中完成.

试试这个

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();
            }
        }
Run Code Online (Sandbox Code Playgroud)

  • 为了避免重复,你可以比较两个表.{SQL ="INSERT INTO SUBCONTRACTOR SELECT*FROM TOMERGE.SUBCONTRACTOR WHERE [YOUR_UNIQUE_ID] NOT IN(从[SUBCONTRACTOR中选择[YOUR_UNIQUE_ID])} (6认同)
  • @JacobCook StackOverflow 上的许多代码答案并不完整,它们只是演示了特定问题的解决方案。它们并不总是包含其他必要的代码。通常假设编码员熟悉有关特定问题的细节。您的问题是关于合并数据库,因此假设您知道如何连接(即打开)数据库。这段代码中显然没有定义“connection”变量,因此必须在其他地方定义并打开它。如果您不明白为什么,您将需要研究 C# 变量和 sqlite 连接。 (2认同)