繁体   English   中英

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

[英]Copy Data from one Sqlite table to another Sqlite table

我需要将数据从一个Sqlite表复制到另一个。 我写了方法,它返回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插入到我的“主”表中,该表具有相同的结构:

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)。

您需要一一指定列或以与创建表完全相同的顺序插入数据。 举例来说,假设您的Messages表如下所示:

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

在此表中插入数据时,可以使用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

您当然需要用适当的表名和列名替换。

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

使用此命令,这将帮助您制作另一个表的副本。 复制表格-新表格名称

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM