ms-help://MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconFillingDataSetWithADORecordset.htm

解决方案 »

  1.   

    为了提供从 ADO.NET 对 ADO 记录集和记录对象的访问,OLE DB .NET Framework 数据提供程序将重载 OleDbDataAdapter 的 Fill 方法,以接受 ADO 记录集或记录对象。用 ADO 对象的内容来填充数据集是单向操作。也就是说,数据可以从 ADO 记录集或记录导入 DataSet,但必须显式地处理对数据的任何更新。不过,一旦使用来自 ADO 对象的数据填充 DataSet,就可以使用 DataAdapter 将更改解析回数据源,也可以将数据写为 XML。如果没有可用的主键信息,则 Fill 操作会将行追加到 DataSet 中现有的 DataTable 对象。如果有可用于 DataTable 的主键信息,则 Fill 操作将用匹配的主键来更新行。有关从数据源检索主键信息的更多信息,请参见向 DataSet 添加现有约束。或者,可以按照为表定义主键中的说明,以编程方式设置主键信息。若要通过 .NET COM Interop 服务和 ADO.NET 使用返回 ADO 记录集或记录对象的组件对象模型 (COM) 组件,需要首先使用类型库导入程序 (Tlbimp.exe) 为 COM 组件和 ADO 导入类型库信息。有关从 .NET Framework 访问 COM 对象的更多信息,请参见向 .NET Framework 公开 COM 组件。注意   Visual Studio.NET 在“Program Files\Microsoft.NET\Primary Interop Assemblies”目录中的文件 adodb.dll 中为 ADO 提供了主 Interop 程序集 (PIA)。如果您安装了 Visual Studio.NET,则建议使用此文件 (adodb.dll),而不要使用类型库导入程序 (tlbimp.exe) 导入您自己的类型库。有关主 Interop 程序集的更多信息,请参见主 Interop 程序集。
    例如,一个 ProgId 为 ADOComponent.DataClass 的现有 COM 组件被编译成 ADOComponent.dll。它具有返回 ADODB.Recordset 类型对象的方法。若要从 .NET 使用此对象,ADOComponent.dll 和 msado15.dll 都应导入,后者包含 ADODB.Recordset 和 ADODB.Record 对象。若要将 COM 类型库导入 .NET,请发出以下命令。TlbImp "C:\Program Files\Common Files\System\Ado\msado15.dll" /out:ADODB.dll
    TlbImp ADOComponent.dll /out:ADOCOM.dll然后,当编译 .NET 程序时,可以通过库引用的形式来传递所生成的 .NET 库(ADODB.dll 和 ADOCOM.dll)。以下代码演示如何通过使用 vbc.exe 和提供导入的 COM 库来编译 Visual Basic .NET 程序。vbc MyVB.vb /r:system.dll /r:system.data.dll /r:system.xml.dll /r:ADODB.dll /r:ADOCOM.dll以下代码演示如何通过使用 csc.exe 和提供导入的 COM 库来编译 C# 程序。csc MyCS.cs /r:system.dll /r:system.data.dll /r:system.xml.dll /r:ADODB.dll /r:ADOCOM.dll以下示例显示当 ADOComponent.DataClass 对象具有返回 ADODB.Recordset 的方法(名为 GetData)时,可以用 .NET 编写的代码。[Visual Basic]
    Dim adoComponent As ADOCOM.DataClass = New ADOCOM.DataClass
    Dim adoRS As ADODB._Recordset = adoComponent.GetData()[C#]
    ADOCOM.DataClass adoComponent = new ADOCOM.DataClass();
    ADODB._Recordset adoRS = adoComponent.GetData();以下代码示例显示如何使用 ADODB.Recordset 对象来填充 (Fill) DataSet。[Visual Basic]
    Dim myDA As OleDbDataAdapter = New OleDbDataAdapter
    Dim myDS As DataSet = New DataSetmyDA.Fill(myDS, adoRS, "MyTable")[C#]
    OleDbDataAdapter myDA = new OleDbDataAdapter();
    DataSet myDS = New DataSet();myDA.Fill(myDS, adoRS, "MyTable");警告   如果将 ADO 记录集或记录对象与 .NET Framework 应用程序一起使用,则每次使用完这些对象后都应调用 Close。这将确保及时释放与数据源的基础连接,同时会防止在现有引用仍然存在时因“垃圾回收”回收非托管 ADO 对象而可能导致的访问冲突。
    请注意,当 Fill 操作完成时,采用 DataSet 和 ADO 对象的 OleDbDataAdapter.Fill 重载将对 ADO 对象隐式地调用“关闭”。在调用采用了 DataTable 的 OleDbDataAdapter.Fill 重载后,需要显式地关闭 ADO 记录集对象或记录对象。