手动创建的记录集不像断开连接的记录集
我有一个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年开始,当时这是最尖端的东西。 :)