将数据从一个 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 名称
我需要将数据从一个 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 名称