簡體   English   中英

手動創建的記錄集的行為不像斷開記錄集

[英]Manually created recordset not behaving like disconnected recordset

我有一個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 = New 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默認為斷開連接的記錄集,但VB6沒有。 您在代碼中打開的記錄集是動態記錄集,如果沒有打開的連接,該記錄集將無法運行。 動態游標類型意味着對記錄集的所有更改都將立即發布到數據庫中。 關閉連接后,您將無法再執行此操作。 您的錯誤表明,當您嘗試添加新記錄時,動態游標正在尋找連接,但找不到該記錄。

您可能有興趣檢查您的CursorLocation是否仍然是adUseClient。 不應該這樣 將類型設置為動態后,游標必須位於服務器端。 您的光標是靜態的,還是您的位置是服務器。

因此,要創建斷開連接的記錄集,屬性必須為:

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

最后一點與在斷開連接的記錄集上進行批處理更改有關,然后與准備發布整個批處理的鎖定,發布記錄並進行沖突解決過程有關。 無論如何,看看是否有幫助。 這應該。

還有一點:如果只是將位置設置為客戶端,則類型將默認為靜態。 這是唯一適用於客戶端的游標類型。 有點道理; 如果您的數據在客戶端,則您正在使用數據的本地“快照”。

是1999年的最簡單的解釋,當時這才是最前沿的東西。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM