利用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; }
记录下,以便后用。