【发布时间】:2014-06-06 01:05:57
【问题描述】:
我有一个 VB6 应用程序,它在其中一个函数中将记录集作为参数。我在 .NET 项目中使用 ADODB 来创建记录集并将其传递给 VB6 项目。当我在 VS2010 中通过连接数据库然后断开连接来创建记录集时,一切都很好:
con.ConnectionString = "Provider=SQLOLEDB.1;Data Source=MyDB;Initial Catalog=IC;User ID=user;Password=pass"
rs.ActiveConnection = con
rs.Open("SELECT * FROM Table1")
rs.ActiveConnection = Nothing
但是,当我通过从 .net DataTable 复制数据来创建记录集时: rsRecordSet = 新的 ADODB.Recordset
For Each dtDataColumn As DataColumn In dtDataTable.Columns
Select Case dtDataColumn.DataType.UnderlyingSystemType.ToString
Case "System.Boolean" : dteRecordSetDataType = DataTypeEnum.adBoolean
Case "System.Byte" : dteRecordSetDataType = DataTypeEnum.adUnsignedTinyInt
Case "System.Char" : dteRecordSetDataType = DataTypeEnum.adChar
Case "System.DateTime" : dteRecordSetDataType = DataTypeEnum.adDate
Case "System.Double" : dteRecordSetDataType = DataTypeEnum.adDouble
Case "System.Int16" : dteRecordSetDataType = DataTypeEnum.adSmallInt
Case "System.Int32" : dteRecordSetDataType = DataTypeEnum.adInteger
Case "System.Int64" : dteRecordSetDataType = DataTypeEnum.adBigInt
Case "System.SByte" : dteRecordSetDataType = DataTypeEnum.adTinyInt
Case "System.Single" : dteRecordSetDataType = DataTypeEnum.adSingle
Case "System.UInt16" : dteRecordSetDataType = DataTypeEnum.adUnsignedSmallInt
Case "System.UInt32" : dteRecordSetDataType = DataTypeEnum.adUnsignedInt
Case "System.UInt64" : dteRecordSetDataType = DataTypeEnum.adUnsignedBigInt
Case "System.Guid" : dteRecordSetDataType = DataTypeEnum.adGUID
Case "System.String" : dteRecordSetDataType = DataTypeEnum.adVarChar
Case Else : dteRecordSetDataType = DataTypeEnum.adVarChar
End Select
If dtDataColumn.AllowDBNull Then
faeRecordSetAttribute = FieldAttributeEnum.adFldIsNullable
Else
faeRecordSetAttribute = FieldAttributeEnum.adFldUnspecified
End If
rsRecordSet.Fields.Append(dtDataColumn.ColumnName, dteRecordSetDataType, dtDataColumn.MaxLength, faeRecordSetAttribute)
Next
rsRecordSet.CursorLocation = CursorLocationEnum.adUseClient
rsRecordSet.CursorType = CursorTypeEnum.adOpenDynamic
rsRecordSet.LockType = LockTypeEnum.adLockOptimistic
rsRecordSet.ActiveConnection = Nothing
rsRecordSet.Open()
For Each dtDataRow As DataRow In dtDataTable.Rows
rsRecordSet.AddNew()
For Each rsField As ADODB.Field In rsRecordSet.Fields
Select Case rsField.Type
Case DataTypeEnum.adBoolean : rsField.Value = Convert.ToBoolean(dtDataRow.Item(rsField.Name))
Case DataTypeEnum.adGUID : rsField.Value = "{" & dtDataRow.Item(rsField.Name).ToString & "}"
Case Else : rsField.Value = dtDataRow.Item(rsField.Name)
End Select
Next
Next
Return rsRecordSet
...我的 VB6 项目立即拒绝它,并出现错误,例如“在此上下文中不允许操作”和“被调用方(服务器 [非服务器应用程序])不可用并消失;所有连接都无效。调用可能已执行。(来自 HRESULT 的异常:0x80010007 (RPC_E_SERVER_DIED))”。我也一直无法一起调试这两个项目(它在某一点上工作)以查看记录集在 VB6 项目中的哪个位置被拒绝,但我有一种感觉,它甚至在它进入我的 VB6 函数之前就已经发生了。
我希望有人可以向我解释这两个不同记录集之间的区别。某个记录集中的某处是否有信息表明它曾经连接到数据库源?有没有一种方法可以从我现有的数据表中“选择”,以便记录集认为它是从某个地方提取的?
提前致谢!
【问题讨论】:
标签: .net datatable vb6 adodb recordset