我需要将数据从一个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查询设置行和列。也许有人有另一个解决方案来完成这项任
答案 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}`";
使用此命令,这将帮助您制作另一个表的副本。 复制表 - 新表名称