|
|
|
Q: ADO - C++Builder
|
|||
|---|---|---|---|
|
#18+
Поиск рыл - ничего не нашел... Мож кто что подскажет по вопросу: Пользую в одном проекте связку С++Builder - ADO. Только не ADOExpress, а нативно, через интерфейсы. (ADO Express в данном проекте использовать низзя) Так вот, никак не получается открыть рекордсет через комманд. В смысле, recordset->open(commandPtr,...) не получается... Отдельно этот command->execute выполняется на ура, а вот при вызове через рекордсет - опаньки... в SQL-profiler даже запроса не вижу. рекордсет, с выставленным ему соответсвующим CommandText тоже работает на ура... В чем бяка - не пойму... Есть ли какие-то хинты по этому поводу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2006, 21:06 |
|
||
|
Q: ADO - C++Builder
|
|||
|---|---|---|---|
|
#18+
--ADO Express в данном проекте использовать низзя а что это за такие ограничения, може зя-зя ? вам шашечки надо или ехать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2006, 21:55 |
|
||
|
Q: ADO - C++Builder
|
|||
|---|---|---|---|
|
#18+
мне - ехать... речь идет о консольном приложении, точнее о сервисе, написанном без всяческих TServiceApplication-ов... компоненты доступа к данным ADOExpress унаследованы от TCustomDataSet, конструктор которого вызывает функцию RPR(), которая в случае чистого консольного приложения не дает отработать конструктору. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2006, 22:09 |
|
||
|
Q: ADO - C++Builder
|
|||
|---|---|---|---|
|
#18+
Ехать все равно с ADO надо вот так : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdmthopenxvc.asp Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2006, 08:44 |
|
||
|
Q: ADO - C++Builder
|
|||
|---|---|---|---|
|
#18+
Эх... а Вы думаете я пытаюсь ехать по-другому? Я ведь потому и спрашиваю, что делаю все, как доктор... гм... MSDN прописал, а не получается... вернее получается, но не везде. И VCL-ные исходники рыл уже... Скажем, тот же код в Делфях работает, а в Билдере - нет... Потому и спрашиваю про хинты - мож кого-нибудь куда-нибудь вкастить надо или еще чего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2006, 19:22 |
|
||
|
Q: ADO - C++Builder
|
|||
|---|---|---|---|
|
#18+
ЗЫЖ и хде в том топике, ссылку на который Вы дали использование Комманд, как соурс для Рекордсэта? повторюсь - в лоб открыть рыкордсэт, хоть с именем таблицы, хоть с именем сторки, хоть с текстом запроса у меня получается без проблем... а вот по сабжу вопроса - увы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2006, 19:29 |
|
||
|
Q: ADO - C++Builder
|
|||
|---|---|---|---|
|
#18+
Так может ты все же покажешь как именно ты создаешь свой commandPtr? А еще полезно сделать перехват ошибок и посмотреть как именно recordset->open() ругается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2006, 19:40 |
|
||
|
Q: ADO - C++Builder
|
|||
|---|---|---|---|
|
#18+
Ну вот так, для примера... _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(); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2006, 20:16 |
|
||
|
Q: ADO - C++Builder
|
|||
|---|---|---|---|
|
#18+
и еще пытался делать комманду execute, передавая в него ссылку рекордсэтовую, чтоб в нее вернул открытый рекордсэт... возвращает туда NULL... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2006, 20:19 |
|
||
|
Q: ADO - C++Builder
|
|||
|---|---|---|---|
|
#18+
сам скуль в КоммандТекст не принципиален - в оригинале там вызов сторки. что-то где-то не так, а вот что - убей Бог, не допру... При чем, повторюсь, если сделать тупо execute() самому Комманду, то в профайлере я вижу выполнившийся запрос, а через рекордсэт - в профайлере тишина. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2006, 20:24 |
|
||
|
Q: ADO - C++Builder
|
|||
|---|---|---|---|
|
#18+
generic /*вот так не работает, никаких эксепшнов, просто рекордсэт не открывается*/ hr = rdlRecordset->Open(rdlCommand, OleVariant(Unassigned), 0x00000003, 0x00000001, 0x00000001); А hr чему равняется? И вообще, убери последний параметр или сделай его равным -1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2006, 20:27 |
|
||
|
Q: ADO - C++Builder
|
|||
|---|---|---|---|
|
#18+
значение hr = -2146825287 заменил последний параметр на (-1) - та же фигня :-( убрать его нельзя - Билдер говорит - too few parameters in call... естественно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2006, 20:32 |
|
||
|
Q: ADO - C++Builder
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2006, 21:11 |
|
||
|
Q: ADO - C++Builder
|
|||
|---|---|---|---|
|
#18+
я так понимаю, макрос 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. Ну, во-первых, СПАСИБО за науку!!! А во-вторых, не будете ли Вы столь добры, чтобы еще носом ткнуть, какие именно аргументы конфликтуют-то? А то методом научного тыка как-то долго будет... Конечно, если не в лом... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2006, 21:45 |
|
||
|
Q: ADO - C++Builder
|
|||
|---|---|---|---|
|
#18+
Нууу.... если честно, я ADO только в VB/VBS пользуюсь, а в С предпочитаю ODBC. Но в строке Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2006, 23:31 |
|
||
|
Q: ADO - C++Builder
|
|||
|---|---|---|---|
|
#18+
попробовал уже, конечно. и все параметры сбивал в ...Unknown и Connection - как NULL, как Null()... результат тот же: 3001... но, по-любому спасибо, бум рыть и другие параметры - комманда и коннекшена. Приложение работает вполне нормально (на прямом открытии рекордсэта), так что время копать есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2006, 10:08 |
|
||
|
Q: ADO - C++Builder
|
|||
|---|---|---|---|
|
#18+
Итак, может кому-то будет интересно... добиться выполнения сабжа указанным способом не удалось. Что бы я ни делал с параметрами - результат один - пресловутая ошибка 3001. Зато удалось добиться желаемого другим способом: вместо объявления _Recordset* rdlRecordset делается объявление _di__Recordset rdlRecordset далее рекордсэт получен как результат метода Command::Execute() hr = rdlCommand->Execute(VarRecsAffected, varParams, 0x00000001, rdlRecordset); В таком виде все заработало. Хотя, по-прежнему, интересуюсь, как заставить заработать исходный код :-))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2006, 13:48 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33914594&tid=2030694]: |
0ms |
get settings: |
11ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
166ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 506ms |

| 0 / 0 |
