powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Соединение к Oracle через ADO. Помогите!
3 сообщений из 3, страница 1 из 1
Соединение к Oracle через ADO. Помогите!
    #32759686
anwolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В базе данных Oracle сделал простой пакет:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE OR REPLACE PACKAGE VFP AS
  TYPE tCursor IS REF CURSOR;
  PROCEDURE Test(cres OUT tCursor);
END;

CREATE OR REPLACE PACKAGE BODY VFP AS
  PROCEDURE Test(cres OUT tCursor) IS
  BEGIN
    OPEN cres FOR SELECT * FROM test;
  END;
END;

Далее, создал два класса:
Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
*--> ODBC
DEFINE CLASS odbc_ca AS CursorAdapter
  DataSourceType = "ODBC"

  PROCEDURE Init
    LPARAMETERS lcCursor
    this.DataSource = SQLCONNECT("WH")
    IF this.DataSource <  1 
      MESSAGEBOX("Невозможно установить соединение с сервером.",  16 , "Ошибка!")
      RETURN .F.
    ENDIF
    this.Alias = lcCursor
    this.SelectCmd = "{CALL VFP.Test()}"
  ENDPROC

  PROCEDURE Destroy
    IF this.DataSource >  0 
      SQLDISCONNECT(this.DataSource)
    ENDIF
  ENDPROC

  PROCEDURE Get
    LOCAL llRet, laSQLerr[ 1 ]
    IF USED(this.Alias)
      USE IN (this.Alias)
    ENDIF
    llRet = this.CursorFill()
    IF !llRet
      AERROR(laSQLerr)
      IF ISNULL(laSQLerr[ 1 ,  3 ])
        MESSAGEBOX(laSQLerr[ 1 ,  2 ],  16 , "Ошибка!")
      ELSE
        MESSAGEBOX(laSQLerr[ 1 ,  3 ],  16 , "Ошибка!")
      ENDIF
    ENDIF
    RETURN llRet
  ENDPROC
ENDDEFINE

*--> ADO
DEFINE CLASS ado_ca AS CursorAdapter
  DataSourceType = "ADO"

  PROCEDURE Init
    LPARAMETERS lcCursor
    LOCAL oConnection
    oConnection = CREATEOBJECT("ADODB.Connection")
    oConnection.ConnectionString = "Provider = OraOLEDB.Oracle; Data Source = WH; User ID = sysman; Password = user0;"
    oConnection.Open()
    this.DataSource = CREATEOBJECT("ADODB.Recordset")
    this.DataSource.ActiveConnection = oConnection
    this.Alias = lcCursor
    this.SelectCmd = "{CALL VFP.Test()}"
  ENDPROC

  PROCEDURE Get
    LOCAL llRet, laSQLerr[ 1 ]
    IF USED(this.Alias)
      USE IN (this.Alias)
    ENDIF
    llRet = this.CursorFill()
    IF !llRet
      AERROR(laSQLerr)
      IF ISNULL(laSQLerr[ 1 ,  3 ])
        MESSAGEBOX(laSQLerr[ 1 ,  2 ],  16 , "Ошибка!")
      ELSE
        MESSAGEBOX(laSQLerr[ 1 ,  3 ],  16 , "Ошибка!")
      ENDIF
    ENDIF
    RETURN llRet
  ENDPROC
ENDDEFINE

Скажите пожалуйста, почему при запуске ODBC_CA.Get(), он корректо возвращает данные, но при запуске ADO_CA.Get() возвращается ошибка Oracle:
Код: plaintext
1.
2.
3.
4.
OraOLEDB: ORA- 06550 : Строка  1 , столбец  7 :
PLS- 00306 : ошибочно число или типы аргументов при обращении к 'TEST'
ORA- 06550 : Строка  1 , столбец  7 :
PL/SQL: Statement ignored

Я понимаю, что бы вызвать корректо процедуру VFP.Test(), например, в Oracle SQL*Plus, в нее недо передать параметр. Например, так:
Код: plaintext
1.
2.
VARIABLE cursor REFCURSOR;
CALL VFP.Test(:cursor);
Тогда результат возвращается в переменную cursor. Но, если эти две строчки записать в свойство SelectCmd, то никаких данных в CursorAdapter не возвращается, т.е. возникает ошибка VFP:
Код: plaintext
1.
No result set has been returned by the server.
И это понятно, результат возвращается в переменную cursor, а не в CursorAdapter.

Может кто знает, как сделать правильно, что бы процедура VFP.Test() работала через ADO?
...
Рейтинг: 0 / 0
Соединение к Oracle через ADO. Помогите!
    #32760040
luser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забей на CursorAdapter, сам все делай ручками, если уж из фокса решил работать через ADO.
И чем кстати тебя не устраивает ODBC ?
...
Рейтинг: 0 / 0
Соединение к Oracle через ADO. Помогите!
    #32760287
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi anwolf!

Мне кажется ты не совсем верно понимаешь специфику работы ADO в плане вызова
хранимых процедур - тебе нужен не объект Recordset, а объект Command и в нём
скорее всего нужно явно описывать параметры - и тип и "направление"
(IN/OUT). Причём у меня есть некоторые сомнения насчёт того что тип данных
RefCursor может быть корректно передан через ADO. По крайней мере чераз ODBC
это возможно лишь используя Oracle ODBC Driver, и лишь включив там поддержку
ResultSet-ов. Скажем тот-же MS ODBC for Oracle не умеет возвращать курсоры
из ХП... В общем надо поэкспериментировать именно с ADODB.Command - и пока
без CA - в самом простом виде - а уж потом интегрировать это в CA - и снова
не так как ты это делаешь ,а как рекомендовано в хелпе - т.е. явно задавать
тип для Select/Insert и т.д. команд как "ADO" и создавать соответствующие
объекты ADODB.Command на каждую "команду".

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Соединение к Oracle через ADO. Помогите!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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