vfpoledb.1 给出 IErrorInfo.GetDescription 失败,第 2 次打开时出现 E_FAIL

本文关键字:FAIL IErrorInfo 给出 GetDescription 失败 vfpoledb | 更新日期: 2023-09-27 18:33:19

vfpoledb.1 在第二次打开时给出 IErrorInfo.GetDescription 失败,E_FAIL(0x80004005)有 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 个代码块的顺序,第一个将起作用,第二个将失败。

vfpoledb.1 给出 IErrorInfo.GetDescription 失败,第 2 次打开时出现 E_FAIL

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