SQLite, скопируйте DataSet / DataTable в файл базы данных - PullRequest
4 голосов
/ 27 ноября 2011

Я заполнил набор данных таблицей, созданной из другого файла базы данных.Таблица НЕ находится в файле базы данных, в который я хочу иметь возможность скопировать таблицу.

Теперь я хочу сохранить все эти записи (DataTable) во вновь созданном файле базы данных SQLite ...

Как я могу это сделать?

Также я действительно хочуИзбегайте циклов, если это возможно.

Лучший ответ - я :), поэтому я поделюсь им. Это цикл, но записывает 100 тыс. записей за 2-3 сек.

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"] уже заполнена всеми данными, которые мне нужно перенести в другую базу данных.Я также использовал цикл для заполнения набора данных.

Ответы [ 2 ]

7 голосов
/ 27 ноября 2011
  • Когда вы загружаете 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);
    
  • Создайте таблицу в базе данных SQLite, выполнив оператор CREATE TABLE непосредственно с SQLiteCommand.ExecuteNonQuery

  • Создайте новый DataAdapter для подключения к базе данных SQLite и используйте его для Update db:

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

Если исходная и целевая таблицы имеют одинаковый столбецимена и совместимые типы, он должен работать нормально ...

6 голосов
/ 13 июня 2016

Способ импорта данных SQL в SQLite займет много времени. Когда вы хотите импортировать данные миллионами, это займет много времени. Поэтому самый короткий и простой способ сделать это - просто извлечь данные из базы данных SQL в DataTable и вставить все ее строки в базу данных 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();
        }
    }

Это займет совсем немного времени по сравнению с ответами, приведенными выше.

...