powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
16 сообщений из 16, страница 1 из 1
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
    #33291520
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Private Sub Command1_Click()
        Dim conn As ADODB.Connection
        Dim rs As ADODB.Recordset
        Dim constr, server, db, zapros As String
               
        On Error Resume Next
        
        server = "HAMMER"
        db = "OrwTest"
        zapros = "Select TOP 10 * from Object_View"
        
        Set conn = New ADODB.Connection
        Set rs = New ADODB.Recordset
        
        constr = "Provider=SQLOLEDB.1;Persist Security Info = False; User ID=orwell;Password=garbage;Initial Catalog=" + db + ";Data Source=" + server + ";Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=" + server + ";Use Encryption for Data=False;Tag with column collation when possible=False"
        conn.Open constr
            
        Set rs.ActiveConnection = conn
        rs.Open zapros, conn, adOpenStatic, adLockOptimistic, adCmdText
        MsgBox rs.RecordCount
End Sub
Есть линкованный сервер, создаю представление
Код: plaintext
1.
2.
3.
4.
5.
CREATE VIEW [Object_VIEW]
AS SELECT *
FROM [dbo].[Object]
Union all
select *
From [LinkedServer1].[OrwTest].[dbo].[Object]
При выполнение VB кода возвращается rs.RecordCount = -1. А в QA всё нормально возвращается, в чём проблема???
На SQL Server'e включина смешенная аутентификация. Может строка подключения не правильно сконфигурированна?
...
Рейтинг: 0 / 0
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
    #33291550
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
rs.CursorLocation=adUseClient
...
Рейтинг: 0 / 0
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
    #33291560
Дурак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А записи-то есть или нет?
...
Рейтинг: 0 / 0
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
    #33291566
Дурак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One
Код: plaintext
rs.CursorLocation=adUseClient


Зачем?

Обязательно нужно, чтобы RecordCount что-то возвращал :-)?
...
Рейтинг: 0 / 0
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
    #33291571
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One:
Работает спасибо.
Можете объяснить почему нахождение курсора на серверной стороне возвращает -1, а на клиентской так как надо?

Дурак: если бы их не было бы, то возвращался бы 0 :)
...
Рейтинг: 0 / 0
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
    #33291577
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RecordCount вставлен для проверки что вообще получаю ответ от БД, раньше и этого не было.
...
Рейтинг: 0 / 0
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
    #33291593
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для проверки надо делать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
If Not rs is nothing then
   if NOT (rs.EOF or rs.BOF) then
   'есть записи
   else
   'нет записей
   end if
else
'ошибка выполнения SQL
end if
...
Рейтинг: 0 / 0
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
    #33291611
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМожете объяснить почему нахождение курсора на серверной стороне возвращает -1, а на клиентской так как надо?

Дело в том, что серверный курсор не знает сколько будет записей, так как он не передает на клиента записи, пока тот их явно не зафетчит, например при помощи MoveLast. Клиентский же выкачивает весь набор на клиентскую машину и уже знает сколько там лежит.
...
Рейтинг: 0 / 0
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
    #33291613
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то же вариант, так почему курсор на сервере так отрабатывается?
...
Рейтинг: 0 / 0
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
    #33291621
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так он же на сервере курсор открывает, а не на клиенте, т.е. физически файлик с данными на сервере лежит и клиент не знает что там , пока к нему не обратиться, см. мой пост выше
...
Рейтинг: 0 / 0
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
    #33291637
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понял, просто когда я написал предпоследний пост твоего ещё не было. И если бы я ещё методом Movenext, то записи нормально отрабатывались бы.
...
Рейтинг: 0 / 0
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
    #33291770
Дурак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AzartKonst_One:
Дурак: если бы их не было бы, то возвращался бы 0 :)

Напрасно улыбаетесь...

RecordCount = -1 это не значит что записей нет. Это значит, что определить точно невозможно. Проверять наличие записей с помощью RecordCount можно только после выполнения MoveLast.
Но если Recordset ForwardOnly это не прокатит...

А лучше всего делать так, как показал Konst_One (и как он объяснил, сорри что повторяюсь, просто отвечаю на обращение ко мне :-)))

Впрочем, я делаю
Код: plaintext
If rs.Bof and rs.Eof... 
- так писать меньше :-)))
...
Рейтинг: 0 / 0
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
    #33292400
А зачем назначать клиентский курсор, когда можно просто воспользоваться Movelast?

ADO HelpIn certain cases, your provider or cursor might be unable to provide the RecordCount value without first fetching all records from the data source. To force this type of fetch, call the Recordset MoveLast method before calling RecordCount.
...
Рейтинг: 0 / 0
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
    #33292728
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробывал заменить
Код: plaintext
rs.CursorLocation = adUseClient
на
Код: plaintext
1.
rs.CursorLocation = adUseServer 
rs.MoveLast
Возвращает -1 !!!
...
Рейтинг: 0 / 0
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
    #33292755
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
Set rs.ActiveConnection = conn
rs.CursorLocation = adUseServer
rs.Open zapros, , adOpenStatic, adLockReadOnly, adCmdText
rs.MoveLast
rs.MoveFirst
 
       MsgBox rs.RecordCount

но я бы так делать все равно не стал
...
Рейтинг: 0 / 0
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
    #33293036
Azart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно и так, без переходов:
Код: plaintext
1.
2.
rs.CursorLocation = adUseServer
rs.Open zapros, conn, adOpenStatic, adLockReadOnly, adCmdText
MsgBox rs.RecordCount
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]