SQLite,将DataSet / DataTable复制到DataBase文件

我用一个从另一个数据库文件创建的表填充了一个DataSet。 该表不在数据库文件中,我希望能够将表复制到。

现在我想将所有这些记录(DataTable)保存到新创建的SQLite数据库文件中……

我怎样才能做到这一点?

如果可能的话,我真的想避免循环。

最好的答案是由我:)所以我会分享它。这是循环,但在2-3secs写入100k条目。

using (DbTransaction dbTrans = kaupykliuduomConn.BeginTransaction()) { downloadas.Visible = true; //my progressbar downloadas.Maximum = dataSet1.Tables["duomenys"].Rows.Count; using (DbCommand cmd = kaupykliuduomConn.CreateCommand()) { cmd.CommandText = "INSERT INTO duomenys(Barkodas, Preke, kiekis) VALUES(?,?,?)"; DbParameter Field1 = cmd.CreateParameter(); DbParameter Field2 = cmd.CreateParameter(); DbParameter Field3 = cmd.CreateParameter(); cmd.Parameters.Add(Field1); cmd.Parameters.Add(Field2); cmd.Parameters.Add(Field3); while (n != dataSet1.Tables["duomenys"].Rows.Count) { Field1.Value = dataSet1.Tables["duomenys"].Rows[n]["Barkodas"].ToString(); Field2.Value = dataSet1.Tables["duomenys"].Rows[n]["Preke"].ToString(); Field3.Value = dataSet1.Tables["duomenys"].Rows[n]["kiekis"].ToString(); downloadas.Value = n; n++; cmd.ExecuteNonQuery(); } } dbTrans.Commit(); } 

在这种情况下,dataSet1.Tables [“duomenys”]已经填充了我需要传输到另一个数据库的所有数据。 我也使用循环来填充数据集。

  • 从源数据库加载DataTable ,将数据适配器的AcceptChangesDuringFill属性设置为false,以便加载的记录保持在已Added状态(假设源数据库是SQL Server)

     var sqlAdapter = new SqlDataAdapter("SELECT * FROM the_table", sqlConnection); DataTable table = new DataTable(); sqlAdapter.AcceptChangesDuringFill = false; sqlAdapter.Fill(table); 
  • 通过使用SQLiteCommand.ExecuteNonQuery直接执行CREATE TABLE语句,在SQLite数据库中CREATE TABLE

  • 为SQLite数据库连接创建一个新的DataAdapter ,并使用它来Update db:

     var sqliteAdapter = new SQLiteDataAdapter("SELECT * FROM the_table", sqliteConnection); var cmdBuilder = new SQLiteCommandBuilder(sqliteAdapter); sqliteAdapter.Update(table); 

如果源表和目标表具有相同的列名和兼容类型,它应该工作正常…

SQL数据导入SQLite需要很长时间。 如果要以数百万的方式导入数据,则需要花费大量时间。 因此,最简单和最简单的方法是在DataTable填充从SQL数据库中获取数据,并将其所有行插入到SQLite数据库中。

 public bool ImportDataToSQLiteDatabase(string Proc, string SQLiteDatabase, params object[] obj) { DataTable result = null; SqlConnection conn = null; SqlCommand cmd = null; try { result = new DataTable(); using (conn = new SqlConnection(ConStr)) { using (cmd = CreateCommand(Proc, CommandType.StoredProcedure, obj)) { cmd.Connection = conn; conn.Open(); result.Load(cmd.ExecuteReader()); } } using (SQLiteConnection con = new SQLiteConnection(string.Format("Data Source={0};Version=3;New=False;Compress=True;Max Pool Size=100;", SQLiteDatabase))) { con.Open(); using (SQLiteTransaction transaction = con.BeginTransaction()) { foreach (DataRow row in result.Rows) { using (SQLiteCommand sqlitecommand = new SQLiteCommand("insert into table(fh,ch,mt,pn) values ('" + Convert.ToString(row[0]) + "','" + Convert.ToString(row[1]) + "','" + Convert.ToString(row[2]) + "','" + Convert.ToString(row[3]) + "')", con)) { sqlitecommand.ExecuteNonQuery(); } } transaction.Commit(); new General().WriteApplicationLog("Data successfully imported."); return true; } } } catch (Exception ex) { result = null; return false; } finally { if (conn.State == ConnectionState.Open) conn.Close(); } } 

与上面给出的答案相比,这将花费很短的时间。