vfpoledb.1在第二次打开时给出IErrorInfo.GetDescription失败,E_FAIL(0x80004005)

时间:2016-02-04 16:38:05

标签: c# sql

vfpoledb.1在第二次打开时,IErrorInfo.GetDescription失败,E_FAIL(0x80004005) 有两个例程使用到同一数据库的连接,每个例程都根据用户选择进行调用。 如果我先选择第一个,它会工作,第二个会失败。 如果我先选择第二个,它会起作用,第一个失败。 我可以反复选择其中一个并且它可以工作。 或者,调用第一个,第二个失败,第一个在此之后工作。 我猜测它在应用程序关闭之前并没有真正断开,但是当我第一次使用它时,我怎么能强制关闭它以便我可以在不同的时候再次使用它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 个答案:

答案 0 :(得分:0)

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