手动创建的记录集不像断开连接的记录集

问题描述:

我有一个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。记录

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默认为断开连接的记录集,但VB6不会。您在代码中打开的记录集是一个动态记录集,在没有开放连接的情况下无法运行。动态cursortype意味着记录集的所有更改都会立即发布到数据库。当你关闭连接时,你不能再这样做了。您的错误表明,当您尝试添加新记录时,动态光标查找连接,并找不到一个连接。

您可能有兴趣检查您的CursorLocation是否仍然是adUseClient。它不应该;一旦你将类型设置为动态,光标必须是服务器端。您的光标是静态的,或者您的位置是服务器。

所以,做一个连接记录的属性必须是:

.CursorLocation = adUseClient 
.CursorType = adOpenStatic 'This is automatic as a result of the previous line 
.LockType = adLockBatchOptimistic 

这最后与上断开连接的记录进行批量更改做,然后当准备好后锁定了整批,张贴记录,然后通过冲突解决程序。无论如何,看看是否有帮助你。这应该。

更多一点:如果您只是将您的位置设置为客户端,类型将默认为静态。这是客户端唯一的cursortype。有道理;如果您的数据位于客户端,则您正在处理数据的本地“快照”。

Here是一个简单的解释,从1999年开始,当时这是最尖端的东西。 :)