将数据从一个 Sqlite table 复制到另一个 Sqlite table

Copy Data from one Sqlite table to another Sqlite table

我需要将数据从一个 Sqlite table 复制到另一个。 我写了方法,return DataTable:

public static DataTable GetDataFromSecondTable(string filePath)
    {
        DataTable DbTable = new DataTable("Messages");
        using (var connection = new SQLiteConnection(filePath))
        {
            string SelectQuery = "SELECT * FROM Messages";
            using (SQLiteCommand cmd = new SQLiteCommand(SelectQuery, connection))
            {
                connection.Open();         

                using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd))
                {
                    adapter.Fill(DbTable);                        
                }
            }
        }
        return DbTable;
    }

然后我需要将此 DataTable 插入到我的 "main" table,它具有相同的结构:

public static void MergeData(string mainDbPath, string secondDbPath)
    {
        DataTable secondTable = GetDataFromSecondTable(secondDbPath);

        using(SQLiteConnection connect = new SQLiteConnection(mainDbPath))
        {
            connect.Open();
            using (var cmd = new SQLiteCommand(connect))
            {
                using (var transaction = connect.BeginTransaction())
                { 
                    foreach(DataColumn column in secondTable.Columns)
                    {
                        foreach(DataRow row in secondTable.Rows)
                        {                                
                            //cmd.CommandText = String.Format("INSERT INTO Messages ('{0}') VALUES('{1}')", column.ColumnName, row);                              
                            cmd.ExecuteNonQuery();
                        }
                    }

                    transaction.Commit();
                }
            }
        }

    }

我不明白我应该如何为 SQLite 查询设置行和列。也许有人对此任务有另一种解决方案。

INSERT 语句需要具体。我的意思是像在 SELECT 语句中那样使用 '*' 不适用于 INSERT(或 UDPATE)。

您需要一一指定列或以与创建 table 完全相同的顺序插入数据。 例如,假设您的 Messages table 看起来像:

CREATE TABLE Messages(
   ID INT PRIMARY KEY     NOT NULL,
   POSTERNAME     TEXT    NOT NULL,
   MESSAGE        CHAR(500)     NOT NULL
);

当您在此 table 中插入数据时,您可以使用这样的 INSERT 语句:

INSERT INTO Messages (ID,POSTERNAME,MESSAGE) 
       VALUES (1,'SomeGuy','SomeMessage');

或使用短语法:

INSERT INTO Messages VALUES (1,'SomeGuy','SomeMessage');

在您的代码中,您可以这样使用:

using (SQLiteConnection connect = new SQLiteConnection(mainDbPath))
{
    connect.Open();
    using (var transaction = connect.BeginTransaction())
    {
        foreach (DataRow row in secondTable.Rows)
        {
            var cmdText= string.Format("INSERT INTO Messages VALUES ({0},'{1}','{2}');",
                row["ID"], row["POSTERNAME"], row["MESSAGE"]);

            using (var cmd = new SQLiteCommand(cmdText, connect, transaction))
            {
                cmd.ExecuteNonQuery();
            }
        }

        transaction.Commit();
    }
}

请注意,我更改了使用顺序。您可能只想在 所有 记录已成功添加到数据库时才提交事务。所以在创建命令之前先启动事务。

您可以通过在 INSERT 中使用 SELECT 语句来简化此操作,如下所示:

INSERT INTO SECONDTABLE SELECT COL1,COL2,COL3 FROM FIRSTTABLE

您当然需要替换为正确的 table 和列名称。

SQLiteCommand createCommand = sqlConnection.CreateCommand();
createCommand.CommandText = $"CREATE TABLE `{CopyTable}` AS SELECT * FROM `{SourceTable}`";

使用此命令,这将帮助您复制另一个 table。 复制 table - 新 table 名称