错误:"找不到可安装的ISAM"

42

我在Excel工作簿中编写了一些VBA代码,用于从同一目录中的Access数据库检索数据。在我的电脑和运行Windows XP的其他几台机器上都能正常工作,但是当我们在Vista机器上测试时,遇到了以下错误:

无法找到可安装的ISAM

我已经在网上搜索了很多,但似乎找不到确切的答案。连接字符串似乎没问题,而且正如我所提到的,它在多台计算机上都能工作。

有没有人知道可能是什么原因引起的?我的连接字符串如下:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\ptdb\Program Tracking Database.mdb;

谢谢

8个回答

79

Extended Properties周围加上单引号:

OleDbConnection oconn = 
    new OleDbConnection(
        @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1;';");

试一下,它真的有效。


2
很棒。它还可以与“Microsoft.ACE.OLEDB.12.0”提供程序和“Excel 12.0 xml”扩展属性一起使用。谢谢! - juanreyesv
2
谢谢,这解决了一个奇怪的问题。请注意,如果您在结果中遇到神秘的缺失数据,则需要使用IMEX=1标志。 - Mason

21

尝试在数据源周围加上单引号:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source='D:\ptdb\Program Tracking Database.mdb';

问题通常在于空格,因为空格对解析器有意义。

如果您有其他属性(例如扩展属性),它们的值也可能需要用单引号括起来:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source='D:\ptdb\Program Tracking Database.mdb'; Extended Properties='Excel 8.0;HDR=YES;IMEX=1;';

你同样可以使用双引号;但是,你可能需要对它们进行转义,而我发现这比使用单引号更加麻烦。


1
@Ortund:它没有解决你的特定问题,这就值得一个踩?!?天哪。 - BIBD
@Dave 这个问题标记为VBA,它不支持C风格的字符转义。在VBA中,您可以在字符串内使用两个双引号来表示一个双引号。 - Zev Spitz
@Ortund 你是在使用VBA还是C#? - Zev Spitz
我不得不在数据源和扩展属性周围加上单引号,然后问题就解决了。谢谢! - Fiona - myaccessible.website
谢谢Fiona。在数据源和扩展属性上都需要使用单引号。 - Hari
显示剩余2条评论

3

只需在连接字符串中使用Jet OLEDB:。

以下是示例:

"Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=E:\Database.mdb;Jet OLEDB:Database Password=b10w"

0

我使用这个工具来更新一个 Excel 12 xlsx 文件

        System.Data.OleDb.OleDbConnection MyConnection;
        System.Data.OleDb.OleDbCommand myCommand = new System.Data.OleDb.OleDbCommand();
        MyConnection = new System.Data.OleDb.OleDbConnection("provider=Microsoft.ACE.OLEDB.12.0;Data Source='D:\\Programming\\Spreadsheet-Current.xlsx';Extended Properties='Excel 12.0;HDR=YES;';");
        MyConnection.Open();
        myCommand.Connection = MyConnection;
        string sql = "Update [ArticlesV2$] set [ID]='Test' where [ActualPageId]=114";// 
        myCommand.CommandText = sql;
        myCommand.ExecuteNonQuery();
        MyConnection.Close();

0

我刚刚遇到了非常类似的问题。

像你一样,我的连接字符串看起来是正确的- 实际上,完全相同的连接字符串在其他情况下也能正常工作。

问题最终被确定是由于资源不足引起的。19次中有18次,我会看到“找不到可安装的 ISAM”,但偶尔(没有任何代码更改),它会变成“内存不足”。

重新启动机器“解决”了这个问题(暂时解决…?)。这是在Windows XP上使用Jet 4.0.9505.0版本时发生的。


-1

使用此连接字符串

string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;" +
      "Data Source=" + strFileName + ";" + "Extended Properties=" + "\"" + "Excel 12.0;HDR=YES;" + "\"";

OP并不是从Excel获取数据,而是从MS Access获取,因此Excel连接字符串不是一个好主意。另外,标签显示为VBA,所以您展示的语法不适合。 - Fionnuala

-2

这个问题是因为机器找不到Access所需的正确的ISAM(索引顺序驱动程序方法)注册表。

很可能是因为机器没有安装MSACeesss?我建议确保您拥有最新版本的Jet,如果仍然无法正常工作,请从其他机器中找到文件Msrd3x40.dll,将其复制到Vista机器的某个位置,并在管理员模式下调用regsvr32(应该可以解决问题)。


1
OLE DB(请注意空格)具有提供程序而不是“驱动程序”,且没有名称为“MS Access”的提供程序。ACE提供程序的名称为Microsoft.ACE.OLEDB.<version>,已弃用的Jet提供程序的名称为Microsoft.Jet.OLEDB.<version>。 - onedaywhen

-2

使用以下连接字符串从XLSX文件中读取:

string ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + <> + ";Extended Properties=Excel 8.0;";


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接