如何将'System .__ ComObject'转换为记录集或数据集?

问题描述:

我已经编写了调用ms访问函数的c#代码。 以下是用c#编写的函数调用“CallModule”。如何将'System .__ ComObject'转换为记录集或数据集?

ms访问中有一个称为“fReturnRecordset”的函数。这个函数返回Recordset。

从c#我们可以成功调用函数。 但我们无法将oRrecordSet对象转换为记录集或数据集。

我获得以下错误:

“Unable to cast COM object of type 'System.__ComObject' to interface type 'ADODB.Recordset'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{00001556-0000-0010-8000-00AA006D2EA4}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).”

每当我尝试typasting(见注释行的代码,即//Recordset rs=(Recordset)oRrecordSet;

毫秒的存取功能:

Public Function fReturnRecordset() As Recordset 
    Dim MyDB As DAO.Database 
    Dim MyRS As DAO.Recordset 
    Dim strSQL As String 
    strSQL = "Select * From Customers Order by ContactName;" 
    Set MyDB = CurrentDb 
    Set MyRS = MyDB.OpenRecordset(strSQL, dbOpenSnapshot) 
    Set fReturnRecordset = MyRS 
End Function 

c#code:

public void CallModule() 
    { 
     try{ 
     Microsoft.Office.Interop.Access.Application oAccess = new Microsoft.Office.Interop.Access.Application(); 
     oAccess.Visible = true; 
     oAccess.OpenCurrentDatabase(@"Path to accdb", false); 
     object oRrecordSet = oAccess.Run("fReturnRecordset"); 
     //Recordset rs=(Recordset)oRrecordSet; 
     oAccess.DoCmd.Quit(AcQuitOption.acQuitSaveNone); 
     oAccess = null; 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 
    } 

如何对返回的对象,记录集或数据集进行类型转换以填充网格。

+0

“ADODB.Recordset”在哪里受到影响? – HansUp

+0

object oRrecordSet = oAccess.Run(“fReturnRecordset”); – user2806630

+0

对不起,我还是不明白。在'fReturnRecordset'中,记录集是'DAO.Recordset'。但不知何故试图从c#访问,错误抱怨'ADODB.Recordset'。 'DAO'和'ADODB'记录集是不同的对象类型。如果你在一个独立的Access应用程序会话中运行该函数,它会返回一个'DAO.Recordset'还是一个'ADODB.Recordset'? – HansUp

上述方法是正确的。它需要更多的代码遍历记录集来填充数据表对象。

public DataTable CallModule() 
    { 
     try{ 
     Microsoft.Office.Interop.Access.Application oAccess = new Microsoft.Office.Interop.Access.Application(); 
     oAccess.Visible = false; 
     oAccess.OpenCurrentDatabase(DataBase, false); 
     dao.Recordset oRecordSet = oAccess.Run("fReturnRecordset"); 

     oRecordSet.OpenRecordset(); 

     //------------------------------------ 
     DataTable dt = new DataTable(); 
     dt.Columns.Add("OriginalName"); 
     dt.Columns.Add("ModifiedName"); 

     while (!oRecordSet.EOF) 
     { 
      DataRow dr = dt.NewRow(); 
      dr["OriginalName"] = Convert.ToString(oRecordSet.Fields[0].Value); 
      dr["ModifiedName"] = Convert.ToString(oRecordSet.Fields[1].Value); 
      dt.Rows.Add(dr); 
     } 

     oRecordSet.Close(); 

     oAccess.DoCmd.Quit(AcQuitOption.acQuitSaveNone); 

     oAccess = null; 

     return dt; 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 
    }