Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset. / 16 сообщений из 16, страница 1 из 1
27.09.2005, 17:08:01
    #33291520
Azart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
Код: 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
27.09.2005, 17:15:38
    #33291550
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
Код: plaintext
rs.CursorLocation=adUseClient
...
Рейтинг: 0 / 0
27.09.2005, 17:18:28
    #33291560
Дурак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
А записи-то есть или нет?
...
Рейтинг: 0 / 0
27.09.2005, 17:22:04
    #33291566
Дурак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
Konst_One
Код: plaintext
rs.CursorLocation=adUseClient


Зачем?

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

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

Код: 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
27.09.2005, 17:33:05
    #33291611
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
авторМожете объяснить почему нахождение курсора на серверной стороне возвращает -1, а на клиентской так как надо?

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

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

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

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

Впрочем, я делаю
Код: plaintext
If rs.Bof and rs.Eof... 
- так писать меньше :-)))
...
Рейтинг: 0 / 0
28.09.2005, 09:57:29
    #33292400
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
А зачем назначать клиентский курсор, когда можно просто воспользоваться 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
28.09.2005, 11:53:12
    #33292728
Azart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
Попробывал заменить
Код: plaintext
rs.CursorLocation = adUseClient
на
Код: plaintext
1.
rs.CursorLocation = adUseServer 
rs.MoveLast
Возвращает -1 !!!
...
Рейтинг: 0 / 0
28.09.2005, 12:01:08
    #33292755
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
Код: 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
28.09.2005, 13:14:42
    #33293036
Azart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset.
Можно и так, без переходов:
Код: plaintext
1.
2.
rs.CursorLocation = adUseServer
rs.Open zapros, conn, adOpenStatic, adLockReadOnly, adCmdText
MsgBox rs.RecordCount
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / MS SQL SERVER 200+Views+LinkedServer, ADODB+Recordset. / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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