Как создать отключенный набор записей ADODB в приложении VB.NET для Windows? - PullRequest
4 голосов
/ 02 сентября 2011

Я использую соединение OLEDB с базой данных Sybase с файлом ADODB.dll версии 7.10.6070.0 (который поставляется из пакета Sybase 12.5). Мне нужно иметь возможность открыть соединение, использовать объект команды, чтобы заполнить набор записей из хранимой процедуры, затем закрыть соединение и передать обратно отключенный набор записей. Мои попытки пока терпят неудачу, так как каждый раз, когда я закрываю соединение, мой набор записей также закрывается (что означает, что он не отключен).

Есть ли свойство, которое я должен установить где-то, чтобы указать, что набор записей должен быть отключен? Я не могу установить Recordset.ActiveConnection = False, потому что получаю исключение («Не удается изменить свойство ActiveConnection объекта Recordset, в качестве источника которого используется объект Command.»). Я устанавливаю Command.ActiveConnection = False, но это не мешает закрытию набора записей, как только я закрываю объект подключения.

Отрывок:

Dim conn as New ADODB.Connection()
conn.Open("connectionString", "UserID", "Password")
Dim cmd as New ADODB.Command()
' Set some parameters on the command.
cmd.ActiveConnection = conn
cmd.CommandText = "StoredProcedureName"
cmd.CommandType = ADODB.CommandTypeEnum.adCmdStoredProc
Dim rs as New ADODB.Recordset()
rs.Open(cmd)
Dim clonedRS as ADODB.Recordset = rs.Clone()  ' one attempt to disconnect recordset
rs.Close()  ' Does not close cloned recordset
cmd.ActiveConnection = Nothing   ' another try at disconnecting recordset
conn.Close()  ' Always closes the recordset, even the cloned one
return clonedRS  ' Sadly, this is closed now.

Ответы [ 2 ]

3 голосов
/ 03 сентября 2011

Я не знаю, решит ли это вашу проблему, но я выполнил поиск в Google и наткнулся на эту статью Отключите набор записей ADO, сгенерированный из объекта Command , который вы могли бы использовать для измените ваш код следующим образом:

Dim conn as New ADODB.Connection()
conn.Open("connectionString", "UserID", "Password")
Dim cmd as New ADODB.Command()
' Set some parameters on the command.
cmd.ActiveConnection = conn
cmd.CommandText = "StoredProcedureName"
cmd.CommandType = ADODB.CommandTypeEnum.adCmdStoredProc

Dim rs As ADODB.Recordset

With rs
    .CursorLocation = adUseClient
    .Open cmd, CursorType:=adOpenStatic, Options:=adCmdStoredProc
    Set .ActiveConnection = Nothing
End With

Dim clonedRS As ADODB.Recordset = rs

Set cmd = Nothing

conn.Close()
rs.Close()
Set conn = Nothing
Set rs = Nothing

Return clonedRS

Есть еще один пример из 4GuysFromRolla Использование отключенных наборов записей , который использует тот же подход.

EDIT

Уточнил пример.

0 голосов
/ 16 мая 2013

вы можете попробовать что-то в этом направлении

Set cmd = New ADODB.command
With cmd
  .ActiveConnection = "your connection"
  .CommandText = "your proc or ssql"
  .CommandType = adCmdStoredProc
  ' .parameter.append  create whether param you need
End With
Set rs = New ADODB.recordset
With rs
  .cursorlocation = adUseClient
  .cursortype = adOpenStatic
  .locktype = adLockBatchOptimistic
  Set rs.Source = cmd    'this is the key
 .Open
 .ActiveConnection = Nothing
End With
' do what ever you need next
...