Асинхронное открытие рекордсета

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
shady
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 09.11.2005 (Ср) 11:03

Асинхронное открытие рекордсета

Сообщение shady » 08.08.2007 (Ср) 8:07

Добрый день. Подскажите пожалуйста в след. вопросах.
1. Почему при открытии рекордсета асинхронно образуется 3 подключения к БД (смотрю в Activity Monitor SQL Server 2005). Все это если не открыто подключение.
2. Если подключение открыто, и я хочу его использовать для открытия рекордсета, при rst.RecordCount происходит ошибка Подключение занято до получения результатов для плучения другого hstmt.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 08.08.2007 (Ср) 15:41

как ты открываешь соединение и как рекордсет, код сюда.

shady
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 09.11.2005 (Ср) 11:03

Сообщение shady » 09.08.2007 (Чт) 7:21

Подключение:
Код: Выделить всё
Set conn = New ADODB.Connection
conn.CursorLocation = adUseClient
conn.CommandTimeout = 15
conn.Open "Driver={SQL Server};server=" & strDataSource & ";Database=DB;", strLogin, strPassword


Рекордсет:

Код: Выделить всё
Public WithEvents rst As ADODB.Recordset
rst.Open "SELECT ...", conn, adOpenStatic, adLockBatchOptimistic, adAsyncFetchNonBlocking

Private Sub rst_FetchComplete(ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
'ошибка возникает на этой строке
stBar.Panels(1).Text = "База данных содержит записей: " & rst.RecordCount
End Sub

Private Sub rst_FetchProgress(ByVal Progress As Long, ByVal MaxProgress As Long, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
    stBar.Panels(3).Text = "Загрузка..."
    PbRecordcount.Value = Progress
End Sub

shady
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 09.11.2005 (Ср) 11:03

Сообщение shady » 09.08.2007 (Чт) 8:46

Нашел в MSDN, правда касаемо SQL Servera, вот это:
MSDN писал(а):Active hstmt
The SQL Server driver can have only one active hstmt unless the driver is used with server cursors. The driver returns this information through SQLGetInfo with the SQL_ACTIVE_STATEMENTS option. An hstmt is defined as active if it has results pending. In this context, results are any information returned by SQL Server, such as a results set or a count of the rows that are affected by an UPDATE statement.

Note An hstmt's activity is not related to its state. For example, if a SELECT statement is executed and it does not return any rows, the statement is not active, because no results are pending. However, before the statement can be executed again, the cursor associated with it must be closed with SQLFreeStmt.

When connected to SQL Server 6.x, the SQL Server driver supports multiple active statements on a single connection when server cursors are used.

When connected to SQL Server 4.2x, the SQL Server driver supports only one active statement per connection. The cursor library (shipped with the SQL Server driver) allows applications to use multiple active statements on a connection.


Так как у меня курсор клиентский, вот он и не может этот hstmt использовать.
Установка rst.CursorLocation = adUseServer по идее должна помочь. Но не скажется ли это на скорости загрузки рекордсета? Про асинхронность можно забыть?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 09.08.2007 (Чт) 12:02

Код: Выделить всё
Public WithEvents rst As ADODB.Recordset
Set rst.ActiveConnection=conn
rst.Open "SELECT ...", , adOpenStatic, adLockBatchOptimistic, adAsyncFetchNonBlocking


и я бы все-таки использовал OLE DB Provider for SQL Server, а не ODBC

shady
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 09.11.2005 (Ср) 11:03

Сообщение shady » 09.08.2007 (Чт) 13:04

Konst_One писал(а):
Код: Выделить всё
Public WithEvents rst As ADODB.Recordset
Set rst.ActiveConnection=conn
rst.Open "SELECT ...", , adOpenStatic, adLockBatchOptimistic, adAsyncFetchNonBlocking


и я бы все-таки использовал OLE DB Provider for SQL Server, а не ODBC


Konst_One! Действительно смена конекшнстринга на SQL Native Client OLE DB помогла.
Код: Выделить всё
Provider=SQLNCLI;Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 105

    TopList