powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Так жить нельзя (CursorAdapter)
8 сообщений из 8, страница 1 из 1
Так жить нельзя (CursorAdapter)
    #32645871
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На сервере MSSQL 2000 DE

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
use northwind
go
drop procedure sp_select_employee
go
create procedure sp_select_employee @employeeid int
As
select * from employees where employeeid=@employeeid
go


В Visual FoxPro 8 SP1

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
* Для простоты это код взят здесь
* http://www.hot.ee/jurisfox/vfp60/ca_05_ru.htm

caADOTypeDS=Createobject("CursorAdapter")
caADOTypeDS.DataSourceType="ADO"
Set Multilocks On
loConnection2DataSource = Createobject('ADODB.Connection')
loConnection2DataSource.ConnectionString = ;
   [Provider=SQLOLEDB. 1 ;Integrated Security=SSPI;Persist Security Info=False;] + ;
   [Initial Catalog=Northwind;Data Source=.;]
loConnection2DataSource.Open()
caADOTypeDS.Datasource = Createobject('ADODB.RecordSet')
caADOTypeDS.Datasource.CursorLocation      = 3 
caADOTypeDS.Datasource.LockType            = 3 
caADOTypeDS.Datasource.ActiveConnection    = loConnection2DataSource
caADOTypeDS.SelectCmd = ;
   "sp_select_employee ?employeeid"

****************
* Далее на основе 
* mk:@MSITStore:c:\program%20files\microsoft%20visual%20foxpro% 208 \dv_foxhelp.chm::/html/folrfcursorfillmethod.htm   

loCmd = Createobject('ADODB.Command')
loCmd.CommandType =  4 	&& cmdStoredProc
loCmd.ActiveConnection = loConnection2DataSource


caADOTypeDS.CursorFill (.f.,.t.,,loCmd)


В profiler'e наблюдаю это
Код: plaintext
1.
exec [Northwind]..sp_procedure_params_rowset N'sp_select_employee ? ',  1 , NULL, NULL

PS> VFP 8 SP1 даже не может нормально распарсить параметры в caADOTypeDS.SelectCmd! И это платформа для Client-Server Development'а? Ну тогда Билл - испанский летчик :(
...
Рейтинг: 0 / 0
Так жить нельзя (CursorAdapter)
    #32646074
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2funikovyuri
Ну это вы зря... Скорее всего что в коде не так... Например добавить exec в SelectCmd. К сожалению сам по ряду причин не использую CA ( У нас трехзвенка и данные передаются через Adodb.Recordset или его xml, а потом этот xml парситься через XmlAdapter)
...
Рейтинг: 0 / 0
Так жить нельзя (CursorAdapter)
    #32646101
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crip , родной, я б очень хотел чтоб ошибка была в моем коде - но где? Я с этим CursorAdapter+ADO уже замучался - то одно то другое...

Говоришь сменить sp_select_employee на exec sp_select_employee - не помогает - да и не могло... в документации
//mk:@MSITStore:c:\program%20files\microsoft%20visual%20foxpro%208\dv_foxhelp.chm::/html/folrfcursorfillmethod.htm

сказано что

The ADO Command object must have its ActiveConnection property set to the appropriate and already open ADO Connection object. When an ADO Command object is passed to Source, Visual FoxPro sets the ADO Command CommandText property to value of the CursorAdapter SelectCmd property. Visual FoxPro parses any parameters in SelectCmd, and creates and sets parameter values in the ADO Command object. CursorFill method then executes in the following manner:
CursorAdapter.DataSource.Open( Source,,,,Options )
Поэтому он просто отправляет SelectCmd в ADODB.Command.Text и все - ему параллельно что там написано :(

PS> А если написать в SelectCmd что-то типа sp_select_employee;1 - то в trace вообще вот это
Код: plaintext
exec [Northwind]..sp_procedure_params_rowset N'exec sp_select_employee',  0 , NULL, NULL

Т.е. он вроде как номер процедуры убрал - вот только в sp_procedure_params_rowset отправил его как 0 !!!
...
Рейтинг: 0 / 0
Так жить нельзя (CursorAdapter)
    #32646307
Pavel_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
необходимо создать объект параметр
присвоить значение
и все работает

ПРИМЕР ИЗ HELP

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
loCommand.CommandText = ;
   "SELECT * FROM customers WHERE Country = ?"
loParam = loCommand.CreateParameter("Country",  129 ,  1 ,  15 , "")
 -------------------------------------------------- 
loCommand.PARAMETERS.APPEND(loParam)
loCommand.PARAMETERS("Country") = "Brazil"

 ------------------------------------------------- 
loCommand.ActiveConnection = loConn
loRs = loCommand.Execute()
loCursor = CREATEOBJECT('CursorAdapter')
WITH loCursor
   .ALIAS          = 'Customers'
   .DATASOURCETYPE = 'ADO'
   llReturn = .CURSORFILL(.F., .F.,  0 , loRs)
   IF llReturn
      BROWSE
      loRs.ActiveCommand.PARAMETERS("Country") = "Canada"
      llReturn  = .CURSORREFRESH()
      IF llReturn
         BROWSE
      ENDIF llReturn
   ELSE
      AERROR(laErrors)
      MESSAGEBOX(laErrors[ 2 ])
   ENDIF llReturn




.... и только время боится пирамид!
...
Рейтинг: 0 / 0
Так жить нельзя (CursorAdapter)
    #32646746
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel_t


Спасибо конечно - но у меня CursorFill() выполняеться на основе ADODB.Command, а не RecordSet - а это не одно и тоже. Я так же действую в рамках документации.
У вас работа с параметрами целиков лежит на ADO - ясно что у ADO таких проблем как у VFP нет... :(
PS> к стати, где в help'e вы нашли такой пример?
...
Рейтинг: 0 / 0
Так жить нельзя (CursorAdapter)
    #32647215
Pavel_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я использую связку
ADODB.Command -- RecordSet -- CursorAdapter

работает быстрее чем через odbc

если работать через ADO то RecordSet всеравно создается


Код: plaintext
PS> к стати, где в help'e вы нашли такой пример?
CursorRefresh Method

CLEAR
LOCAL loConn AS ADODB.CONNECTION, ;
loCommand AS ADODB.COMMAND, ;
loParam AS ADODB.PARAMETER, ;
loRs AS ADODB.Recordset,;
loException AS EXCEPTION, ;
loCursor AS CURSORADAPTER, ;
lcCountry, ;
laErrors[1]
loConn = CREATEOBJECT('ADODB.Connection')
WITH loConn
.ConnectionString = [Provider=SQLOLEDB.1;Integrated Security=SSPI;PersistSecurity Info=False;Initial Catalog=Northwind;Data Source=.;]
TRY
.OPEN()
CATCH TO loException
MESSAGEBOX(loException.MESSAGE)
CANCEL
ENDTRY
ENDWITH
loCommand = CREATEOBJECT('ADODB.Command')
loCommand.CommandText = ;
"SELECT * FROM customers WHERE Country = ?"
loParam = loCommand.CreateParameter("Country", 129, 1, 15, "")
loCommand.PARAMETERS.APPEND(loParam)
loCommand.PARAMETERS("Country") = "Brazil"
loCommand.ActiveConnection = loConn
loRs = loCommand.Execute()
loCursor = CREATEOBJECT('CursorAdapter')
WITH loCursor
.ALIAS = 'Customers'
.DATASOURCETYPE = 'ADO'
llReturn = .CURSORFILL(.F., .F., 0, loRs)
IF llReturn
BROWSE
loRs.ActiveCommand.PARAMETERS("Country") = "Canada"
llReturn = .CURSORREFRESH()
IF llReturn
BROWSE
ENDIF llReturn
ELSE
AERROR(laErrors)
MESSAGEBOX(laErrors[2])
ENDIF llReturn
ENDWITH
.... и только время боится пирамид!
...
Рейтинг: 0 / 0
Так жить нельзя (CursorAdapter)
    #32647408
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я использую связку
ADODB.Command -- RecordSet -- CursorAdapter

И я тоже - только немного по другому. Я так понимаю - и тот и тот вариант рекомендованы документацией и в принципе эквивалентны. Буду сегодня экспериментировать. Просто не хотелось хостить еще и RecordSet - ведь по хорошему даже Command - тоже должен был быть реализован MS в составе самого CursorAdapter...

То что RecordSet создается - это ясен пень - только не в результате работы Command. Т.е. можно создать RecordSet - сохранить его в CA.DataSource и забыть - т.е. далее руками только Command - в вашем же варианте рекордсет создается только как результат Execute() - что явно менее удобно :(

Ну ничего - вроде workaraund найден - а от VFP я другого и не жду.

PS> Насчет параметров
Я создал таблицу cmd_parameters - и туда в design-time кидаю параметры от stored procedures (написано через ADOX), затем оттуда когда надо эту информацию загружаю - таким образом отпадает необходимость каждый раз писать всю эту муть для CreateParameter() . Если интересно могу сюда запостить :)
...
Рейтинг: 0 / 0
Так жить нельзя (CursorAdapter)
    #32647434
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запости вдруг когда-нибудь пригодится...
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Так жить нельзя (CursorAdapter)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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