У меня две почти одинаковые базы данных (обе * .mdb), но в одной из них несколько новых таблиц. Теперь я могу обнаруживать только таблицы, которые нужно импортировать, используя приведенный ниже код:

    public static List<string> GetDBTables(string path)
    {
        List<string> allTables = new List<string>();
        String connect = ("Provider=Microsoft.JET.OLEDB.4.0;data source=" 
                                     + path + ";Persist Security Info=False;");

        OleDbConnection con = new OleDbConnection(connect);
        con.Open();

        DataTable tables = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, 
                                     new object[] { null, null, null, "TABLE" });

        int counter = 1;
        foreach (DataRow row in tables.Rows)
        {
            allTables.Add(row[2].ToString());
            counter++;
        }
        con.Close();

        return allTables;
    }

    var withNewTables = GetDBTables(".\\one.mdb");
    var withoutNewTables = GetDBTables(".\\another.mdb");
    var NotFoundTables = withNewTables.Except(withoutNewTables).ToList();

Как я могу импортировать эти таблицы в старую базу данных с помощью C #?

3
Andrey Baulin 25 Дек 2013 в 18:13

2 ответа

Лучший ответ

Access SQL предлагает две полезные здесь функции.

  1. SELECT <field list> INTO NewTable
  2. FROM table_name IN 'path to other db file'

Таким образом, я могу выполнить этот оператор из соединения OleDb с моим целевым файлом db, и он создаст tblFoo_copy из данных, содержащихся в tblFoo в другом файле db, NewData.mdb .

SELECT f.* INTO tblFoo_copy
FROM tblFoo AS f IN 'C:\Users\hans\Documents\NewData.mdb';

Создайте и выполните аналогичные операторы для каждой из тех таблиц, которые вы хотите импортировать.

6
HansUp 25 Дек 2013 в 17:17

Что ж, в дополнение к ответу HansUp я публикую его реализацию на C #:

public static void insertTables(string path_from, string path_to, 
                                                            List<string> _tables)
{
    string conString = ("Provider=Microsoft.JET.OLEDB.4.0;data source=" 
                                    + path_to + ";Persist Security Info=False;");
    OleDbConnection dbconn = new OleDbConnection(conString);
    dbconn.Open();
    OleDbCommand dbcommand = new OleDbCommand();

    _tables.ForEach(delegate(String name)
    {
        string selQuery = "SELECT f.* INTO " + name + " FROM " + name 
                                               + " AS f IN '" + path_from + "';";

        dbcommand.CommandText = selQuery;
        dbcommand.CommandType = CommandType.Text;
        dbcommand.Connection = dbconn;
        int result = dbcommand.ExecuteNonQuery();
    });

    dbconn.Close();
}

insertTables(".\\one.mdb", ".\\another.mdb", NotFoundTables);
5
Andrey Baulin 26 Дек 2013 в 00:02