Можно ли изменить схему базы данных MS Access с помощью ADO.NET? - PullRequest
5 голосов
/ 11 января 2012

Мне нужно изменить схему базы данных MS Acess (.mdb) с помощью кода.

Поскольку операторы DDL Jet Engine (ALTER TABLE и т. Д.) Довольно плохо документированы, я бы предпочел использовать какую-либо библиотеку объектов, например DAO (myDatabase.TableDefs("myTable").Fields.Append(myNewField)) или ADOX (myCatalog.Tables("myTable").Columns.Append(myNewField)) или SMO ​​(которая доступно только для SQL Server, синтаксис аналогичен - вы поняли).

Есть ли что-то похожее на ADOX для ADO.NET или я застрял с использованием операторов DDL или обращением к старым библиотекам DAO / ADOX?

1 Ответ

1 голос
/ 03 сентября 2013

Я добился приличного успеха с прямыми заявлениями ddl. Ваше право, синтаксис требует немного поиска в Google, чтобы разобраться, но я какое-то время обрабатывал обновления локальных БД. Есть ли конкретное обновление, с которым у вас проблемы? По сути, я написал несколько вспомогательных функций для проверки структуры таблицы и добавления полей при необходимости.

public bool doesFieldExist(string table, string field)
    {
        bool ret = false;
        try
        {
            if (!openRouteCon())
            {
                throw new Exception("Could not open Route DB");
            }
            DataTable tb = new DataTable();
            string sql = "select top 1 * from " + table;
            OleDbDataAdapter da = new OleDbDataAdapter(sql, routedbcon);
            da.Fill(tb);
            if (tb.Columns.IndexOf(field) > -1)
            {
                ret = true;
            }

            tb.Dispose();


        }
        catch (Exception ex)
        {
            log.Debug("Check for field:" + table + "." + field + ex.Message);
        }

        return ret;
    }


    public bool checkAndAddColumn(string t, string f, string typ, string def = null)
    {

        // Update RouteMeta if needed.
        if (!doesFieldExist(t, f))
        {
            string sql;
            if (def == null)
            {
                sql = String.Format("ALTER TABLE {0} ADD COLUMN {1} {2} ", t, f, typ);
            }
            else
            {
                sql = String.Format("ALTER TABLE {0} ADD COLUMN {1} {2} DEFAULT {3} ", t, f, typ, def);
            }
            try
            {
                if (openRouteCon())
                {
                    OleDbCommand cmd = new OleDbCommand(sql, routedbcon);
                    cmd.ExecuteNonQuery();
                    string msg = "Modified :" + t + " added col " + f;
                    log.Info(msg);
                    if (def != null)
                    {
                        try
                        {
                            cmd.CommandText = String.Format("update {0} set {1} = {2}", t, f, def);
                            cmd.ExecuteNonQuery();
                        }
                        catch (Exception e)
                        {
                            log.Error("Could not update column to new default" + t + "-" + f + "-" + e.Message);
                        }

                    }
                    return true;
                }
            }
            catch (Exception ex)
            {
                log.Error("Could not alter RouteDB:" + t + " adding col " + f + "-" + ex.Message);
            }

        }
        else
        {
            return true;

        }
        return false;
    }
...