【问题标题】:Merging two SQLite database files (C# .NET)合并两个 SQLite 数据库文件 (C# .NET)
【发布时间】:2011-05-31 10:53:51
【问题描述】:

我正在使用 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; 

这是我的查询代码。

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();
        }
    }

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

【问题讨论】:

    标签: c# .net sqlite merge


    【解决方案1】:

    当您在 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();
                }
            }
    

    【讨论】:

    • 太棒了!这有效,但它不会删除重复项。你对如何处理有什么建议吗?除了插入之外,我还可以使用其他命令吗?再次感谢您的帮助。
    • 为避免重复,您可以比较两个表格。 { SQL = "INSERT INTO SUBCONTRACTOR SELECT * FROM TOMERGE.SUBCONTRACTOR WHERE [YOUR_UNIQUE_ID] 不在 (SELECT [YOUR_UNIQUE_ID] FROM SUBCONTRACTOR) }
    • @Binil 我跟着你的回答,但无法让它工作。它一直说没有定义“连接”。我发布了一个问题,询问是否有任何更现代或更好的解决方案。如果您能帮我解决这个问题或回答我的问题,我将不胜感激:) stackoverflow.com/questions/59115084/…
    • @JacobCook StackOverflow 上的许多代码答案并不完整,它们只是演示了针对特定问题的解决方案。它们并不总是包含其他必要的代码。通常假定编码人员熟悉围绕特定问题的细节。您的问题是关于合并数据库的,因此假设您知道如何连接(即打开)数据库。 connection 变量显然没有在这段代码中定义,所以它必须在别处定义和打开。如果你不明白为什么,你需要研究 C# 变量和 sqlite 连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 2018-06-09
    • 1970-01-01
    相关资源
    最近更新 更多