[英]Copy data from one page to SQLite database on another page Xamarin
[英]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.