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(); } }
与上面给出的答案相比,这将花费很短的时间。