【问题标题】:Is it possible to modify an MS Access database schema using ADO.NET?是否可以使用 ADO.NET 修改 MS Access 数据库架构?
【发布时间】:2012-02-07 22:09:29
【问题描述】:

我需要通过代码修改 MS Acess 数据库 (.mdb) 的 schema

由于 Jet Engine DDL 语句(ALTER TABLE 等)的文档记录很差,我更喜欢使用某种对象库,如 DAO (myDatabase.TableDefs("myTable").Fields.Append(myNewField)) 或 ADOX (myCatalog.Tables("myTable").Columns.Append(myNewField)) 或 SMO(其中仅适用于 SQL Server,语法类似 - 你懂的)。

是否有类似 ADOX for ADO.NET 的东西,还是我坚持使用 DDL 语句或引用旧的 DAO/ADOX 库?

【问题讨论】:

  • poorly documented 是什么意思?您不清楚哪个陈述?无论如何,您可以在 .NET 中使用 ADOX。例如,请参阅How to create an Access database by using ADOX and Visual C# .NET
  • 感谢您的链接,看起来文档在最新版本的 Access 中得到了极大的改进。还有一个例子: ALTER TABLE 页面不包含有效数据类型的列表;完全不清楚(从文档中),例如,我将如何创建一个精度为 X 和比例为 Y 的新小数。同时,我发现了这样一个数据类型关键字表(它在用户 cmets 部分中链接CREATE TABLE documentation),但这与 SQL Server BOL 等的质量相差甚远。
  • 不知道 .NET 的 ADOX“更新”。 Here 是一个使用 C# 创建数据库的 ADOX 示例。而且,是的,Access 的 DDL 文档很少,但有一些书籍可以提供帮助。
  • 哦,另外一个为什么通过 DDL 管理 Access 模式不是一个好主意的原因:The schema rowsets are broken. 我刚刚学会了 OLE DB 模式表和 ODBC 模式表都不会返回正确的 IS_NULLABLE访问字段的值。检查访问字段是否可为空的唯一可靠方法似乎是使用DAO并检查myField.Required。这是多么可悲?必须在 2012 年向 .net 项目添加 DAO 引用...
  • 我在 .NET 1.0 Beta 中的经验是,通过 COM 互操作的 DAO 最适合您尝试做的事情......或者如果可以的话,切换到 SQLite :)跨度>

标签: c# database ms-access ado.net dao


【解决方案1】:

我在直接 ddl 语句方面取得了不错的成功。你的权利,语法需要一点谷歌搜索才能梳理出来,但我一直在以这种方式处理本地数据库的更新。是否有您遇到问题的特定更新? 基本上我写了一些辅助函数来检查表的结构并在需要时附加字段。

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;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2013-05-03
    相关资源
    最近更新 更多