【问题标题】:VB6 ADO Disconnected recordset returns no recordsVB6 ADO 断开连接的记录集不返回任何记录
【发布时间】:2012-04-19 09:49:35
【问题描述】:

我正在创建、打开和断开与 MySQL 数据库的记录集。这对于一个查询可以正常工作,但对于数据库中存在行的另一查询返回 0 条记录。在它工作的地方,我也可以从记录集中删除记录。

返回记录的查询:

sql = "select convert(v.wonotes using UTF8) as WonData, v.wo_cat_id, v.id As wo_desc_id, v.line_no as line_no, " & _
      " v.wo_id as wo_id, v.prop_id as prop_id, convert(v.description using UTF8) as description, v.cat_id as cat_id, " & _
      " v.completion_date as completion_date from vw_property_wo_desc v " & _
      " where v.wo_cat_id= 6 and **(v.wo_status = 'completed' or v.wo_status = 'approved')** " & _
      " and v.wonotes is not null and v.wonotes<> '' "

不返回记录的查询:

sql = "select convert(v.wonotes using UTF8) as WonData, v.wo_cat_id, v.id As wo_desc_id, v.line_no as line_no, " & _
      " v.wo_id as wo_id, v.prop_id as prop_id, convert(v.description using UTF8) as description, v.cat_id as cat_id, " & _
      " v.completion_date as completion_date from vw_property_wo_desc v " & _
      " where v.wo_cat_id= 6 and **v.wo_status = 'unassigned'** " & _
      " and v.wonotes is not null and v.wonotes<> '' "

没有其他变化。

如果我将游标类型更改为 adOpenDynamic,查询会返回记录,但我无法断开它。这只是为了证明数据库有满足该查询的记录。

断开记录集的代码:

With rsToUse

    If .State = adStateOpen Then .Close

    .ActiveConnection = GetConnection
    .Source = sql
    .CursorLocation = adUseClient
    .CursorType = adOpenForwardOnly
    .LockType = adLockBatchOptimistic
    .Open

    If .EOF Then
        .Close
        Exit Function
    End If

    .ActiveConnection = Nothing

End With

我的想法已经用完了,请帮忙。

【问题讨论】:

  • 我认为您的意思是说您正在打开然后断开记录集。您是否尝试过使用静态游标类型?
  • @BobRiemersma:用正确的文字更新了问题。是的,我尝试过使用静态,但仍然不返回记录。我将光标端设置为客户端的那一刻,它停止返回记录。如果设置为服务器,则返回记录。
  • 还有一个观察 - 如果将 cursortype 设置为 adForwardOnly 和服务器端,我开始在 BLOB 字段中获取空值。使用静态似乎有效 - 但仍然是服务器端。
  • 据我们所知,您遇到了您正在使用的 Provider 的限制。如果您依赖笨重的 MySQL ODBC 驱动程序,这也可能是一个问题(并且它也必须通过适配器层 MSDASQL 进行转换)。您可以/是否尝试过这将是一个用于 MySQL 的全功能 OLEDB 提供程序?
  • 我倾向于同意这个限制(不管它是什么),除了前面的查询适用于断开连接的记录集。由于代码被广泛使用,因此更改数据库驱动程序的工作量很大。无论如何,我限制了它将从动态游标返回的记录数并将其保留为动态。谢谢

标签: mysql vb6 ado


【解决方案1】:

这是我用来从 SQL Server 数据库中获取断开连接的记录集的代码。我怀疑它也适用于 MySQL 数据库(当然连接字符串除外)。

Public Function GetRecordset(ByVal SQL As String) As ADODB.Recordset

    Dim DB As ADODB.Connection
    Dim RS As ADODB.Recordset

    Set DB = CreateObject("ADODB.Connection")
    DB.ConnectionString = globalConnectionString
    DB.CursorLocation = adUseClient
    DB.CommandTimeout = 0
    Call DB.Open

    Set RS = CreateObject("ADODB.Recordset")
    RS.CursorLocation = adUseClient
    Call RS.Open(SQL, DB, adOpenForwardOnly, adLockReadOnly)
    Set RS.ActiveConnection = Nothing
    Set GetRecordset = RS
    Set RS = Nothing
    DB.Close
    Set DB = Nothing

End Function

这个确切的代码已经投入生产至少 5 年了,没有任何问题。我鼓励你试一试。

我认为使用断开连接记录集的神奇组合是确保连接对象将 CursorLocation 设置为 UseClient,并且记录集对象是 ForwardOnly 和 LockReadOnly。

【讨论】:

  • 谢谢 - 我明天试试。
  • 我试过了,但仍然没有记录。顺便说一句,在 Connection 级别将 CursorLocation 设置为 Client 也会将 Recordset 的默认值设置为客户端。我不想这么说——但这似乎很奇怪,因为第一个查询没有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多