vfpoledb.1 在第二次打开时给出 IErrorInfo.GetDescription failed with E_FAIL(0x80004005)

Posted

技术标签:

【中文标题】vfpoledb.1 在第二次打开时给出 IErrorInfo.GetDescription failed with E_FAIL(0x80004005)【英文标题】:vfpoledb.1 gives IErrorInfo.GetDescription failed with E_FAIL(0x80004005) on 2nd open 【发布时间】:2016-02-04 16:38:04 【问题描述】:

有 2 个例程使用到同一个数据库的连接,每个例程都根据用户选择进行调用。 如果我先选择第一个,它可以工作,第二个失败。 如果我先选择第二个,它会起作用,而第一个会失败。 我可以重复选择其中一个,它可以工作。 或者,调用第一个,第二个失败,然后第一个工作。 我猜在应用程序关闭之前它并没有真正断开连接,但是当我第一次完成它时如何强制它关闭,以便我可以在不同的 dbf 文件文件夹中再次使用它相同的“数据库”?

strFilename = "OneOfTheFoxProDBTables"
System.Data.OleDb.OleDbConnection conFPro = new System.Data.OleDb.OleDbConnection("Provider=VFPOLEDB.1;Data Source=\\\\fileserver01\\dbfFolder\\;");
var sqlselect = "select id, sColumn1, sColumn2 from 'FILENAME.dbf'  ".Replace("FILENAME", strFilename);
System.Data.OleDb.OleDbCommand cmd3 = new System.Data.OleDb.OleDbCommand(sqlselect, conFPro);
conFPro.Open();
DataSet dsDbfTableRows = new DataSet();
System.Data.OleDb.OleDbDataAdapter da3 = new System.Data.OleDb.OleDbDataAdapter(cmd3);
da3.Fill(dsDbfTableRows);  // THIS WORKS !!
conFPro.Close();   
conFPro.Dispose();  //?? Tried with and without, doesn't seem to matter.   

然后,在一个单独的方法中,在一个单独的类中:

strFilename = "AnotherFoxProDBTables"   
System.Data.OleDb.OleDbConnection conFPro2 = new System.Data.OleDb.OleDbConnection("Provider=VFPOLEDB.1;Data Source=\\\\fileserver02\\dbfFolder\\;");    
var sqlselect02 = "select id, sColumnA, sColumnB from 'FILENAME.dbf' ".Replace("FILENAME", strFilename);    
System.Data.OleDb.OleDbCommand cmd5 = new System.Data.OleDb.OleDbCommand(sqlselect02, conFPro2);    
conFPro2.Open();        // <--- FAILS HERE! >>>  IErrorInfo.GetDescription failed with E_FAIL(0x80004005)    
DataSet dsDbfTableRows = new DataSet();
System.Data.OleDb.OleDbDataAdapter da5 = new System.Data.OleDb.OleDbDataAdapter(cmd5);
da5.Fill(dsDbfTableRows); 
conFPro2.Close();   
conFPro2.Dispose();  

如果我然后交换调用 2 块代码的顺序,第一个将工作,第二个将失败。

【问题讨论】:

您应该添加一些代码,以便人们可以看到您在做什么。 我没有完全解决,但我想我可能已经解决了我的具体实现。我将第二个方法移到包含第一个方法的类中,现在无论调用顺序如何,它们都可以工作。 【参考方案1】:

VPOLEDB 提供程序的 Dispose() 方法似乎存在问题,以至于在应用退出之前它不会真正释放资源。将使用 VPOLEDB 提供程序的两种方法移到同一个类中,可以使它们以任意顺序工作。

【讨论】:

以上是关于vfpoledb.1 在第二次打开时给出 IErrorInfo.GetDescription failed with E_FAIL(0x80004005)的主要内容,如果未能解决你的问题,请参考以下文章

Redshift JDBC 连接在 R 中第二次打开时崩溃

在使用ItemContainerGenerator进行自定义时,WPF ComboBox在第二次打开之前不会更新项目

浙大学长分享,第二次打数据挖掘赛,雪浪算力开发者大赛总结

自定义功能区选项卡在第二次启动时消失

第二次冲刺

关于高德地图Android开发时地图只显示一次第二次打开不定位的解决办法