ADOX 报错分析与解决方案
一、ADOX 简介
ADOX(Microsoft ActiveX Data Objects Extensions for DDL and Security)是微软提供的一个扩展库,专门用于处理数据库定义语言(DDL)和安全性,它允许开发者通过编程方式创建、修改和删除数据库表、索引、视图等对象,并管理用户和权限,ADOX主要用于与Access数据库的交互,但也可以用于其他支持OLEDB或ODBC的数据源。

二、常见问题及解决方案
1. 无法嵌入互操作类型“ADOX.CatalogClass”
错误描述:
系统报错:“无法嵌入互操作类型‘ADOX.CatalogClass’,请改用适用的接口。”
原因分析:
此错误通常发生在使用Visual Studio进行开发时,由于项目引用的DLL文件设置不正确,导致无法正确嵌入互操作类型。
解决方案:

更改嵌入互操作类型设置:选中项目中引用的Microsoft ADO Ext. x for DDL and Security
,右键点击选择“属性”,将“嵌入互操作类型”设置为False
。
2. 参数类型不正确或不在可以接受的范围之内
错误描述:
在使用ADOX新建表时报错:“参数类型不正确,或不在可以接受的范围之内,或与其他参数冲突。”
原因分析:
该错误通常是由于连接字符串格式不正确或连接未成功打开导致的。

解决方案:
检查连接字符串:确保连接字符串格式正确,
- string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path;
确保连接打开:在设置ActiveConnection
之前,确保连接已经成功打开。
- OleDbConnection Conn = new OleDbConnection(connectionString);
- Conn.Open();
- catalog.ActiveConnection = Conn;
3. 找不到类型或命名空间名“ADOX”
错误描述:
错误提示:“找不到类型或命名空间名‘ADOX’,是否缺少using指令或程序集引用?”
原因分析:
此错误通常是因为没有添加对msadox.dll
和msjro.dll
的引用。
解决方案:
添加引用:浏览并添加对以下两个DLL的引用:
- C:\Program Files\Common Files\System\ado\msadox.dll
- C:\Program Files\Common Files\System\ado\msjro.dll
具体步骤如下:
右键点击项目,选择“添加引用”。
选择“浏览”,找到上述DLL文件并添加。
在代码顶部添加using ADOX;
和using JRO;
。
4. 多步 OLE DB 操作产生错误
错误描述:
错误提示:“多步 OLE DB 操作产生错误,如果可能,请检查每个 OLE DB 状态值,没有工作被完成。”
原因分析:
此错误通常是由于连接字符串中包含了不必要的参数,如Persist Security Info=False;
。
解决方案:
简化连接字符串:去掉不必要的参数,
- string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + accdb;
或者对于Access 2003及更早版本:
- string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + accdb;
5. 没有注册类
错误描述:
错误提示:“没有注册类”。
原因分析:
此错误通常是由于系统中未安装或注册相应的COM组件。
解决方案:
注册组件:确保已安装并注册Microsoft Access Database Engine
,可以通过安装最新版本的[Microsoft Access Database Engine](https://www.microsoft.com/enus/download/details.aspx?id=13255)来解决这个问题。
三、示例代码
以下是一个完整的示例代码,展示如何使用ADOX在Access数据库中创建一个新表,并进行基本的CRUD操作。
- using System;
- using System.Data.OleDb;
- using ADOX;
- class Program
- {
- static void Main()
- {
- string dbPath = @"D:\example.mdb";
- CreateTable(dbPath, "TestTable");
- InsertIntoTable(dbPath, "TestTable", new string[] { "Column1", "Column2" }, new string[] { "Value1", "Value2" });
- UpdateTable(dbPath, "TestTable", "Column1", "NewValue1", "Column2", "Value2");
- SelectFromTable(dbPath, "TestTable");
- DeleteFromTable(dbPath, "TestTable", "Column1", "Value1");
- }
- static void CreateTable(string dbPath, string tableName)
- {
- ADOX.CatalogCreate(dbPath);
- using (OleDbConnection conn = new OleDbConnection($"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={dbPath}"))
- {
- conn.Open();
- ADOX.Catalog cat = new ADOX.Catalog();
- cat.ActiveConnection = conn;
- ADOX.Table table = new ADOX.Table();
- table.Name = tableName;
- table.ParentCatalog = cat;
- table.Columns.Append("Column1", ADOX.DataTypeEnum.adVarWChar);
- table.Columns.Append("Column2", ADOX.DataTypeEnum.adVarWChar);
- table.Columns["Column1"].Properties["IsNullable"].Value = true;
- table.Columns["Column2"].Properties["IsNullable"].Value = true;
- table.Columns["Column1"].Properties["ColumnDef"].Value = 255; // Max length of column1
- table.Columns["Column2"].Properties["ColumnDef"].Value = 255; // Max length of column2
- table.Columns["Column1"].Properties["ColumnName"].Value = "Column1";
- table.Columns["Column2"].Properties["ColumnName"].Value = "Column2";
- table.Columns["Column1"].Properties["ColumnID"].Value = null;
- table.Columns["Column2"].Properties["ColumnID"].Value = null;
- table.Columns["Column1"].Properties["DefaultValue"].Value = null;
- table.Columns["Column2"].Properties["DefaultValue"].Value = null;
- table.Columns["Column1"].Properties["AllowZeroLength"].Value = false;
- table.Columns["Column2"].Properties["AllowZeroLength"].Value = false;
- table.Columns["Column1"].Properties["IsPrimaryKey"].Value = false;
- table.Columns["Column2"].Properties["IsPrimaryKey"].Value = false;
- table.Columns["Column1"].Properties["AutoIncrement"].Value = false;
- table.Columns["Column2"].Properties["AutoIncrement"].Value = false;
- table.Columns["Column1"].Properties["UnicodeCompressionFails"].Value = false;
- table.Columns["Column2"].Properties["UnicodeCompressionFails"].Value = false;
- table.Columns["Column1"].Properties["Collation"].Value = null;
- table.Columns["Column2"].Properties["Collation"].Value = null;
- table.Columns["Column1"].Properties["CollationOrder"].Value = null;
- table.Columns["Column2"].Properties["CollationOrder"].Value = null;
- table.Columns["Column1"].Properties["CollationCompareSort"].Value = null;
- table.Columns["Column2"].Properties["CollationCompareSort"].Value = null;
- table.Columns["Column1"].Properties["RelatedCollationCompareSort"].Value = null;
- table.Columns["Column2"].Properties["RelatedCollationCompareSort"].Value = null;
- table.Columns["Column1"].Properties["RelatedCollationCompareSortDirection"].Value = null;
- table.Columns["Column2"].Properties["RelatedCollationCompareSortDirection"].Value = null;
- table.Columns["Column1"].Properties["RelatedCollationCompareSortPatternImplicit"].Value = null;
- table.Columns["Column2"].Properties["RelatedCollationCompareSortPatternImplicit"].Value = null;
- table.Columns["Column1"].Properties["RelatedCollationCompareSortPatternExplicit"].Value = null;
- table.Columns["Column2"].Properties["RelatedCollationCompareSortPatternExplicit"].Value = null;
- table.Columns["Column1"].Properties["RelatedCollationCompareSortPatternConfig"].Value = null;
- table.Columns["Column2"].Properties["RelatedCollationCompareSortPatternConfig"].Value = null;
- table.Columns["Column1"].Properties["RelatedCollationCompareSortPatternSource"].Value = null;
- table.Columns["Column2"].Properties["RelatedCollationCompareSortPatternSource"].Value = null;
- table.Columns["Column1"].Properties["RelatedCollationCompareSortPatternTarget"].Value = null;
- table.Columns["Column2"].Properties["RelatedCollationCompareSortPatternTarget"].Value = null;
- table.Columns["Column1"].Properties["RelatedCollationCompareSortPatternResult"].Value = null;
- table.Columns["Column2"].Properties["RelatedCollationCompareSortPatternResult"].Value = null;
- table.Columns["Column1"].Properties["RelatedCollationCompareSortPatternCaseSensitive"].Value = null;
- table.Columns["Column2"].Properties["RelatedCollationCompareSortPatternCaseSensitive"].Value = null;
- table.Create(); // Exception occurs here if the table already exists or other issues arise
- }
- }
- static void InsertIntoTable(string dbPath, string tableName, string[] columns, values)
- {
- using (OleDbConnection conn = new OleDbConnection($"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={dbPath}"))
- {
- conn.Open();
- OleDbCommand cmd = new OleDbCommand($"INSERT INTO {tableName} ({string.Join(", ", columns)}) VALUES ({string.Join(", ", values)})", conn);
- cmd.ExecuteNonQuery();
- }
- }
- static void UpdateTable(string dbPath, string tableName, string setClause, whereClause)
- {
- using (OleDbConnection conn = new OleDbConnection($"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={dbPath}"))
- {
- conn.Open();
- OleDbCommand cmd = new OleDbCommand($"UPDATE {tableName} SET {setClause} WHERE {whereClause}", conn);
- cmd.ExecuteNonQuery();
- }
- }
- static void SelectFromTable(string dbPath, string tableName)
- {
- using (OleDbConnection conn = new OleDbConnection($"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={dbPath}"))
- {
- conn.Open();
- OleDbCommand cmd = new OleDbCommand($"SELECT * FROM {tableName}", conn);
- OleDbDataReader reader = cmd.ExecuteReader();
- while (reader.Read())
- {
- Console.WriteLine($"{reader[0]}, {reader[1]}");
- }
- }
- }
- static void DeleteFromTable(string dbPath, string tableName, string whereClause)
- {
- using (OleDbConnection conn = new OleDbConnection($"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={dbPath}"))
- {
- conn.Open();
- OleDbCommand cmd = new OleDbCommand($"DELETE FROM {tableName} WHERE {whereClause}", conn);
- cmd.ExecuteNonQuery();
- }
- }
- }
四、FAQs与解决方法补充说明
1、如何备份Access数据库?
方法一:手动复制.mdb
文件,这是最简单的方法,但需要注意文件正在使用时可能会导致数据不一致。
方法二:使用VBA脚本或第三方工具(如Access自带的备份功能)进行备份,这些工具通常提供更多的选项和更高的可靠性。
方法三:使用命令行工具msaccess
进行备份。msaccess source_db /backup backup_db
。
方法四:编写自定义程序进行备份,确保在备份过程中数据库没有被其他进程锁定。
2、如何恢复Access数据库?
方法一:手动复制备份文件到原始位置,并重命名为原始数据库文件名,注意在恢复前关闭所有访问该数据库的应用程序。
方法二:使用VBA脚本或第三方工具进行恢复,这些工具通常提供更多的选项和更高的可靠性。
方法三:使用命令行工具msaccess
进行恢复。msaccess original_db /restore backup_db
。
方法四:编写自定义程序进行恢复,确保在恢复过程中没有其他进程访问该数据库。
3、如何压缩Access数据库?
方法一:使用Access自带的压缩功能,打开Access数据库,选择“压缩和修复数据库”选项,这是最简单和推荐的方法。
方法二:使用VBA脚本进行压缩。Application.CompactCurrentDatabase "path_to_db"
,这种方法适用于需要自动化压缩任务的场景。
方法三:使用第三方工具进行压缩,这些工具通常提供更多的选项和更高的可靠性。