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

时间:2015-03-05 12:02:07

标签: c# sqlite ado.net

我需要将数据从一个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插入我的" main"表,具有相同的结构:

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查询设置行和列。也许有人有另一个解决方案来完成这项任

2 个答案:

答案 0 :(得分:3)

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

您需要使用正确的表名和列名替换。

答案 1 :(得分:0)

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

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