如何将'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;
}
}
如何对返回的对象,记录集或数据集进行类型转换以填充网格。
答
上述方法是正确的。它需要更多的代码遍历记录集来填充数据表对象。
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;
}
}
“ADODB.Recordset”在哪里受到影响? – HansUp
object oRrecordSet = oAccess.Run(“fReturnRecordset”); – user2806630
对不起,我还是不明白。在'fReturnRecordset'中,记录集是'DAO.Recordset'。但不知何故试图从c#访问,错误抱怨'ADODB.Recordset'。 'DAO'和'ADODB'记录集是不同的对象类型。如果你在一个独立的Access应用程序会话中运行该函数,它会返回一个'DAO.Recordset'还是一个'ADODB.Recordset'? – HansUp