powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Q: ADO - C++Builder
17 сообщений из 17, страница 1 из 1
Q: ADO - C++Builder
    #33904197
generic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поиск рыл - ничего не нашел...
Мож кто что подскажет по вопросу:

Пользую в одном проекте связку С++Builder - ADO. Только не ADOExpress, а нативно, через интерфейсы. (ADO Express в данном проекте использовать низзя)
Так вот, никак не получается открыть рекордсет через комманд.
В смысле, recordset->open(commandPtr,...) не получается...

Отдельно этот command->execute выполняется на ура, а вот при вызове через рекордсет - опаньки... в SQL-profiler даже запроса не вижу.

рекордсет, с выставленным ему соответсвующим CommandText тоже работает на ура... В чем бяка - не пойму...

Есть ли какие-то хинты по этому поводу?
...
Рейтинг: 0 / 0
Q: ADO - C++Builder
    #33904236
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--ADO Express в данном проекте использовать низзя

а что это за такие ограничения, може зя-зя ?
вам шашечки надо или ехать ?
...
Рейтинг: 0 / 0
Q: ADO - C++Builder
    #33904245
generic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мне - ехать...

речь идет о консольном приложении, точнее о сервисе, написанном без всяческих TServiceApplication-ов...

компоненты доступа к данным ADOExpress унаследованы от TCustomDataSet, конструктор которого вызывает функцию RPR(), которая в случае чистого консольного приложения не дает отработать конструктору.
...
Рейтинг: 0 / 0
Q: ADO - C++Builder
    #33912056
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ехать все равно с ADO надо вот так :


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdmthopenxvc.asp
Код: plaintext
...
Рейтинг: 0 / 0
Q: ADO - C++Builder
    #33914249
generic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Эх... а Вы думаете я пытаюсь ехать по-другому?

Я ведь потому и спрашиваю, что делаю все, как доктор... гм... MSDN прописал, а не получается... вернее получается, но не везде.
И VCL-ные исходники рыл уже...

Скажем, тот же код в Делфях работает, а в Билдере - нет...
Потому и спрашиваю про хинты - мож кого-нибудь куда-нибудь вкастить надо или еще чего.
...
Рейтинг: 0 / 0
Q: ADO - C++Builder
    #33914258
generic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЗЫЖ и хде в том топике, ссылку на который Вы дали использование Комманд, как соурс для Рекордсэта?

повторюсь - в лоб открыть рыкордсэт, хоть с именем таблицы, хоть с именем сторки, хоть с текстом запроса у меня получается без проблем...

а вот по сабжу вопроса - увы...
...
Рейтинг: 0 / 0
Q: ADO - C++Builder
    #33914269
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так может ты все же покажешь как именно ты создаешь свой commandPtr?
А еще полезно сделать перехват ошибок и посмотреть как именно recordset->open() ругается.
...
Рейтинг: 0 / 0
Q: ADO - C++Builder
    #33914298
generic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну вот так, для примера...

_Connection* Conn = NULL;
_Recordset* rdlRecordset = NULL;
_Command* rdlCommand = NULL;
HRESULT hr;
OleVariant VarRecsAffected;

CoInitialize(NULL);

CoCreateInstance(CLASS_Connection, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, __uuidof(_Connection), (void**)&Conn);
Conn->CommandTimeout = 15;
Conn->ConnectionTimeout = 15;
Conn->IsolationLevel = 0x00001000;
Conn->Mode = 0xFFFFFFFF;
Conn->CursorLocation = 0x00000003;

Conn->Open(WideString("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=test;Data Source=(local)"),
"", "", 0);

hr = CoCreateInstance(CLASS_Command, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, __uuidof(_Command), (void**)&rdlCommand);

hr = rdlCommand->Set_ActiveConnection(Conn);
rdlCommand->Set_CommandText(WideString("select * from Table1"));
rdlCommand->CommandType = 0x00000001;

hr = CoCreateInstance(CLASS_Recordset, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, __uuidof(_Recordset), (void**)&rdlRecordset);

/*вот так не работает, никаких эксепшнов, просто рекордсэт не открывается*/
hr = rdlRecordset->Open(rdlCommand, OleVariant(Unassigned), 0x00000003, 0x00000001, 0x00000001);

/* а вот так работает */
//hr = rdlRecordset->Open(WideString("select * from Table1"), Conn, 0x00000003, 0x00000001, 0x00000001);

if (FAILED(hr)) ShowMessage("not opened");
else ShowMessage("Opened");


rdlRecordset->Close();
rdlRecordset = NULL;
rdlCommand = NULL;

Conn->Close();
Conn = NULL;

CoUninitialize();
...
Рейтинг: 0 / 0
Q: ADO - C++Builder
    #33914301
generic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и еще пытался делать комманду execute, передавая в него ссылку рекордсэтовую, чтоб в нее вернул открытый рекордсэт...
возвращает туда NULL...
...
Рейтинг: 0 / 0
Q: ADO - C++Builder
    #33914304
generic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сам скуль в КоммандТекст не принципиален - в оригинале там вызов сторки.

что-то где-то не так, а вот что - убей Бог, не допру...

При чем, повторюсь, если сделать тупо execute() самому Комманду, то в профайлере я вижу выполнившийся запрос, а через рекордсэт - в профайлере тишина.
...
Рейтинг: 0 / 0
Q: ADO - C++Builder
    #33914307
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
generic /*вот так не работает, никаких эксепшнов, просто рекордсэт не открывается*/
hr = rdlRecordset->Open(rdlCommand, OleVariant(Unassigned), 0x00000003, 0x00000001, 0x00000001);
А hr чему равняется?
И вообще, убери последний параметр или сделай его равным -1.
...
Рейтинг: 0 / 0
Q: ADO - C++Builder
    #33914312
generic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
значение hr = -2146825287

заменил последний параметр на (-1) - та же фигня :-(

убрать его нельзя - Билдер говорит - too few parameters in call... естественно...
...
Рейтинг: 0 / 0
Q: ADO - C++Builder
    #33914331
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hr это HRESULT. Это не число, это хендл объекта.

Вот это прочитай:
ADO 2.8
Handling Errors in Visual C++
In COM, most operations return an HRESULT return code that indicates whether a function completed successfully. The #import directive generates wrapper code around each "raw" method or property and checks the returned HRESULT. If the HRESULT indicates failure, the wrapper code throws a COM error by calling _com_issue_errorex() with the HRESULT return code as an argument. COM error objects can be caught in a try-catch block. (For efficiency's sake, catch a reference to a _com_error object.)

Remember, these are ADO errors: they result from the ADO operation failing. Errors returned by the underlying provider appear as Error objects in the Connection object's Errors collection.

The #import directive only creates error-handling routines for methods and properties declared in the ADO .dll. However, you can take advantage of this same error-handling mechanism by writing your own error-checking macro or inline function. See the topic Visual C++® Extensions for examples.
...
Рейтинг: 0 / 0
Q: ADO - C++Builder
    #33914356
generic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я так понимаю, макрос HRESULT_CODE(hr) дает, собственно, код ошибки, так?

собственно, получается, реальный код ошибки 3001, смотрим MSDN на сей счет:

adErrInvalidArgument 3001
-2146825287
0x800A0BB9 Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.

Ну, во-первых, СПАСИБО за науку!!!

А во-вторых, не будете ли Вы столь добры, чтобы еще носом ткнуть, какие именно аргументы конфликтуют-то?
А то методом научного тыка как-то долго будет... Конечно, если не в лом...
...
Рейтинг: 0 / 0
Q: ADO - C++Builder
    #33914394
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нууу.... если честно, я ADO только в VB/VBS пользуюсь, а в С предпочитаю ODBC.
Но в строке
Код: plaintext
hr = rdlRecordset->Open(rdlCommand, OleVariant(Unassigned), 0x00000003, 0x00000001, 0x00000001);
Меня смущают два параметра. Второй и последний. Попробуй указать NULL вместо OleVariant(Unassigned). И тип строки в CommandText надо бы указать adCmdUnknown или adCmdUnspecified.
...
Рейтинг: 0 / 0
Q: ADO - C++Builder
    #33914510
generic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
попробовал уже, конечно.
и все параметры сбивал в ...Unknown и Connection - как NULL, как Null()...

результат тот же: 3001...

но, по-любому спасибо, бум рыть и другие параметры - комманда и коннекшена.

Приложение работает вполне нормально (на прямом открытии рекордсэта), так что время копать есть.
...
Рейтинг: 0 / 0
Q: ADO - C++Builder
    #33914594
generic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итак, может кому-то будет интересно...

добиться выполнения сабжа указанным способом не удалось.
Что бы я ни делал с параметрами - результат один - пресловутая ошибка 3001.

Зато удалось добиться желаемого другим способом:

вместо объявления _Recordset* rdlRecordset
делается объявление _di__Recordset rdlRecordset

далее рекордсэт получен как результат метода Command::Execute()

hr = rdlCommand->Execute(VarRecsAffected, varParams, 0x00000001, rdlRecordset);

В таком виде все заработало.

Хотя, по-прежнему, интересуюсь, как заставить заработать исходный код :-)))
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Q: ADO - C++Builder
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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