利用ADOX组件创建mdb数据库

网上到处都是利用ADOX组件创建mdb数据库及表的例子。一般代码如下:

前期:

引用Interop.ADODB.dll及Interop.ADOX.dll

然后:using ADOX;

核心代码:

ADOX.Catalog catalog = new ADOX.Catalog();
catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DbPath + ";");

但是,这样写的话,有一个很大的问题,那就是无法释放com组件对文件的访问。即,如果这样写,完成后,MDB文件还是(被com组件访问)处于打开状态。这时,无论你在创建后,写上: Marshal.FinalReleaseComObject(catalog);还是写catalog =null;都无法纠正这种情况,经过一番研究,发现是由于ADOX的Create方法,是带有返回对象的,如果不手动释放这个对象,那么这个对象会一直存在,导致生成文件被释放。于是稍微修改下代码,即可修正。

catalog = new ADOX.Catalog();
cn = catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DbPath + ";");
cn.Close();

附上创建mdb的全部代码:

public bool CreateMDBTable()
        {
            ADOX.Catalog catalog = null;
            ADODB.Connection cn = null;
            try
            {
                
                if (File.Exists(DbPath) == false)
                {
                    catalog = new ADOX.Catalog();
                    cn = catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DbPath + ";");
                    cn.Close();
                    cn = null;
                    catalog = null;
                }
                catalog = new ADOX.Catalog();
                //创建链接
                cn = new ADODB.Connection();
                //打开
                cn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DbPath);

                //激活链接
                catalog.ActiveConnection = cn;

                //创建表
                ADOX.Table table = new ADOX.Table();

                table.Name = "FirstTable" + DateTime.Now.ToShortTimeString();

                //创建列
                ADOX.Column column = new ADOX.Column();

                column.ParentCatalog = catalog;

                //列名称
                column.Name = "RecordId";

                //列类型
                column.Type = DataTypeEnum.adInteger;

                //默认长度
                column.DefinedSize = 9;

                //自动增长列
                column.Properties["AutoIncrement"].Value = true;

                //将列添加到表中
                table.Columns.Append(column, DataTypeEnum.adInteger, 9);

                //第一列为主键
                table.Keys.Append("FirstTablePrimaryKey", KeyTypeEnum.adKeyPrimary, column, null, null);

                table.Columns.Append("CustomerName", DataTypeEnum.adVarWChar, 50);

                table.Columns.Append("Age", DataTypeEnum.adInteger, 9);

                table.Columns.Append("Birthday", DataTypeEnum.adDate, 0);

                catalog.Tables.Append(table);

            }
            catch (Exception ex)
            {
                _strErrorInfo = ex.Message;
                return false;
            }
            finally
            {
                if (cn != null)
                {
                    cn.Close();
                    Marshal.FinalReleaseComObject(cn);
                }
                catalog.ActiveConnection = null;

                Marshal.FinalReleaseComObject(catalog);
            }
            return true;
        }

记录下,以便后用。

posted @ 2015-01-04 13:41  Shapley  阅读(923)  评论(0编辑  收藏  举报