如何将“System.__ComObject”类型转换为记录集或数据集

本文关键字:记录 数据集 类型转换 ComObject System | 更新日期: 2023-09-27 18:32:20

我已经编写了 c# 代码来调用 ms access 函数。 下面是用c#编写的函数调用"CallModule"。

在ms访问中有一个叫做"fReturnRecordset"的函数。此函数返回记录集。

从 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)).”

每当我尝试打字时。(请参阅代码中的注释行,即//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# 代码:

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;
        }
    }

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

如何将“System.__ComObject”类型转换为记录集或数据集

上述方法是正确的。它需要更多的代码来循环访问记录集以填充数据表对象。

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.MoveNext();
        }
        oRecordSet.Close();
        oAccess.DoCmd.Quit(AcQuitOption.acQuitSaveNone);
        oAccess = null;
        return dt;
        }
        catch (Exception ex)
        {
            throw;
        }
    }