для неё потребуется скачать OTL и иметь на машине оракловые include/lib
после сборки приложение зависит ТОЛЬКО от установленного Oracle client, никаких ODBC драйверов не нужно.
Сценарий использования:
1) создаётся объект CSQLConnect
2) при необходимости создаются собственные обработчики исключений и свой монитор SQL команд. (наследуются от CSQLExceptionHandlerBase и CSQLMonitorBase соотв.)
3) указываются данные подключения CSQLConnect::SetLogonInfo
4) выполняется соединене CSQLConnect::Connect
Полностью поддерживается MFC тип данных COleDataTime(). При желании можно достать OTL'ный описатель подключения (CSQLConnect::GetRawConnect) и напрямую юзать те возможности OTL, которые не реализованы в этой обёртке. Так же есть вкусности типа кешированного датасета и возможность слияния запросов.
Если заинтересуетесь — с удовольствием отвечу на возникающие вопросы и исправлю найденные ошибки.
Re[2]: Параметризированный запрос в MFC
От:
Аноним
Дата:
06.02.06 14:57
Оценка:
Здравствуйте, Аноним, Вы писали:
А>возьми вот эту либу.
ИМХО, ещё лучше взять ADO. Никак не пойму, чего народ так любит с MFC/ODBC париться? Неужели только из-за того, что МС лет 15 назад, когда кроме ODBC ничего не было, засунул эти классы в MFC?
Re[3]: Параметризированный запрос в MFC
От:
Аноним
Дата:
06.02.06 19:04
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>>возьми вот эту либу.
А>ИМХО, ещё лучше взять ADO. Никак не пойму, чего народ так любит с MFC/ODBC париться? Неужели только из-за того, что МС лет 15 назад, когда кроме ODBC ничего не было, засунул эти классы в MFC?
Очень жаль, что вы не потрудились посмотреть приведённые мной ссылки. Иначе бы вы поняли что приведённый мной способ ни в коей мере не опирается на MFC (а тем более на ODBC). Это самое что ни на есть нативное решение для Oracle, работающее напрямую через OCI. Только в отличие от муторного OCI лёгкость использования сравнима с Delphi/VB. Эффективность ADO всё-таки похуже будет "родного" Ораклового интерфейса. Плюс для этих либ не нужно ничего лишнего тащить на машину.
Re[2]: Параметризированный запрос в MFC
От:
Аноним
Дата:
06.02.06 19:21
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, tzragravorox, Вы писали:
А>возьми вот эту либу.
SQLQuery (hstmt, "INSERT INTO [TABLE] ([name]) VALUES (?s)", lpszName);
SQLQuery (hstmt, "UPDATE [TABLE] SET [name] = ?s WHERE ([id] = ?)", lpszName, &id);
SQLQuery (hstmt, "UPDATE [TABLE] SET [data] = ?b WHERE ([id] = ?)", pData, &iSizeData, &id);
?B, ?b — бинарный тип передается указатель на буффер и указатель на размер буфера;
?S, ?s — строковый тип указатель на NULL-terminated string;
?F, ?f — REAL тип БД, передается указатель на float C type;
?D, ?d — FLOAT тип БД, передается указатель на double C type;
? — указатель на целый тип int.
Re[3]: Параметризированный запрос в MFC
От:
Аноним
Дата:
07.02.06 06:09
Оценка:
Здравствуйте, Symon, Вы писали:
S>Примеры запросов: S>
S>SQLQuery (hstmt, "INSERT INTO [TABLE] ([name]) VALUES (?s)", lpszName);
S>SQLQuery (hstmt, "UPDATE [TABLE] SET [name] = ?s WHERE ([id] = ?)", lpszName, &id);
S>SQLQuery (hstmt, "UPDATE [TABLE] SET [data] = ?b WHERE ([id] = ?)", pData, &iSizeData, &id);
S>
S>
S>?B, ?b — бинарный тип передается указатель на буффер и указатель на размер буфера;
S>?S, ?s — строковый тип указатель на NULL-terminated string;
S>?F, ?f — REAL тип БД, передается указатель на float C type;
S>?D, ?d — FLOAT тип БД, передается указатель на double C type;
S>? — указатель на целый тип int.
как у вас биндятся даты ? входные-выходные параметры процедур ?
Здравствуйте, tzragravorox, Вы писали:
T>Я окончательно запутался.
[skipped]
T>
T>void CDatabase::BindParameters(HSTMT /* hstmt */)
T>{
T> // Must override and call SQLBindParameter directly
T>}
T>
T>Что ето значит?
T>В MNSD говаритса что при исползовании ExecuteSQL нужно переопределять эту функцию.
T>Но у меня даже нет обекта CDatabase.
T>Я понял что ODBC отстой но неужели некто это ранше не делал я почти закончил, не хочетса все менять.
T>Сп!
Позвольте с вами не согласиться — то что вы приводите есть MFC
Фукции ODBC просты, написаны на C (а не С++), главное: последовательность действий правильно задать
Последовательность действий:
1. В MSDN (я искал в MSDN98) SQLExecute.
2. В разделе можно получить ссылки на другие функции, пример SQLBindParameter, и даже с примером
3. Да и примеров полно. В MSSQL7 кажется, был примерчик для ODBC, как хранимые процедуры MSSQL вызывать всякие.
Я сделал давно-давно сделал себе C++ библиотечку поверх ODBC, и уже лет 12 использую.
Наворотов не много:
1. логин автоматически, по сохраненной ранее строки соединения.Если нет ее, через SQLDriverConnect, который позволяет выбрать драйвер.
2. SQL пишу руками,
3. Pезультат ловлю в структурированный класс
(Дать могу, но код не очень изящный: местами очень старый и как всегда без коментариев , проще самому написать, если чего — в мыло стукни).
Как правило быстродействия хватаиет для небольших проектов (типа найти-распечатать-скоректировать-добавить).
А других типов проектов не так и много
Здравствуйте, Аноним, Вы писали:
А>для неё потребуется скачать OTL и иметь на машине оракловые include/lib А>после сборки приложение зависит ТОЛЬКО от установленного Oracle client.
Улыбнуло.
Напоминает компилирование прог под линукс — скачайте эту либу, для нее эту, для нее еще парочку этих и ничего кроме еще трех либ вам больше не понадобится
Re[3]: Параметризированный запрос в MFC
От:
Аноним
Дата:
08.02.06 01:23
Оценка:
Здравствуйте, Burz, Вы писали:
B>Здравствуйте, Аноним, Вы писали:
А>>для неё потребуется скачать OTL и иметь на машине оракловые include/lib А>>после сборки приложение зависит ТОЛЬКО от установленного Oracle client.
B>Улыбнуло. B>Напоминает компилирование прог под линукс — скачайте эту либу, для нее эту, для нее еще парочку этих и ничего кроме еще трех либ вам больше не понадобится
Эх, ну так уж вышло, что либа опирается на OTL (на один-единственный *.h файл).
Ну я для сборки приложений использующих OCI как ни вертись, а inclue/lib ораклиные нужны
для сборки действительно больше ничего не понадобится, плюс дистрибутив ничего кроме программы ложить не придётся
Огромное Огромное Огромное Огромное Огромное СПАСИБО!
я бы потратил недели рабочеги времени на все это(я вед навичок).
Все ок.
Дашел до последней части.
осталос это все для BLOB написать.
Должен запихнут болшие данние в ORACLE XMLTYPE.
если писать
CString XML="большой документ"
INSERT INTO TABLE (XML_FIELD) VALUES (XMLTYPE('XML'))
если XML>4000баит
то провал
попробую с блоб .
с радастю приму ваши совети.
СПАСИБО!
tzragravorox — Copyright (C) 2007
Re: Параметризированный запрос в MFC
От:
Аноним
Дата:
09.02.06 10:04
Оценка:
Уважаемы Symon если вас незатруднит, можно примерчик для BLOB?
А то я никак не могу разобратса с этим CLongBinary.
В XMLTYPE есть конструктор который берет BLOB и впихивает в ячейку.
INSERT INTO TABLE (XMLFIELD) VALUES (XMLTYPE(//сдес этот сами параметр BLOB))
Вы писали:
SQLQuery (hstmt, "UPDATE [TABLE] SET [data] = ?b WHERE ([id] = ?)", pData, &iSizeData, &id);
// ?B, ?b — бинарный тип передается указатель на буффер и указатель на размер буфера;
А что из себя представляет pData?
У меня данние в CString хранятса.
Могу ли я дать просто указатель на CString, или нужно исползовать CLongBinary?
SQLQuery (hstmt, "UPDATE [TABLE] SET [data] = ?b WHERE ([id] = ?)", pData, &iSizeData, &id);
pData — это указатель на блок памяти, т.е. CString::GetBuffer ();
iSizeData — размер блока в байтах, т.е. если стринг в ANSI, то CString::GetLenght ();
но можно вот так:
SQLQuery (hstmt, "UPDATE [TABLE] SET [data] = ?s WHERE ([id] = ?)", (LPCTSTR) strData, &id);
Здравствуйте, tzragravorox, Вы писали:
T>Когда данние не превишают 4000 баит все ок, но когда болше 4000 неполучаетса. T>По моему это из SQL_CHAR. T>Вот именно по этому мне нужен блоб. T>А вот с блоб проблемма , можно именно пример с блоб?(у меня данние в CString xml),если конечно вас не затруднит T>Большое Спасибо!
Этот то вариант не подходит?
SQLQuery (hstmt, "UPDATE [TABLE] SET [data] = ?b WHERE ([id] = ?)", pData, &iSizeData, &id);
pData — это указатель на блок памяти, т.е. CString::GetBuffer ();
iSizeData — размер блока в байтах, т.е. если стринг в ANSI, то CString::GetLenght ();
T>А какои тип у pData? я пробовал LPSTR вроде неполучилось. T>Спасибо!
Так приведите явно к LPSTR
SQLQuery (hstmt, "UPDATE [TABLE] SET [data] = ?b WHERE ([id] = ?)", (LPSTR) pData, &iSizeData, &id);
Это конечно пример плохого дизайна, но как я понял сейчас главное чтоб работало, да и в данном контексте это не страшно. А вообще "неполучилось" — понятие довольно размытое. Чем четче сформулируете, тем быстрее получите ответ. Например: не компилируется, ошибка компилятора такая то и т.д.
Здравствуйте, Alexey Frolov, Вы писали:
AF>Так приведите явно к LPSTR
AF>SQLQuery (hstmt, "UPDATE [TABLE] SET [data] = ?b WHERE ([id] = ?)", (LPSTR) pData, &iSizeData, &id);
У меня другая проблемма:
если исползую ?S то ограничение в размере,
если ?B то по моему проблемма меняетса:
данние идут а БД не выполняет запрос из за не правилного исползование конструктора XMLTYPE
с параметром блоб.
AF>Это конечно пример плохого дизайна, но как я понял сейчас главное чтоб работало, да и в данном контексте это не страшно. А вообще "неполучилось" — понятие довольно размытое. Чем четче сформулируете, тем быстрее получите ответ. Например: не компилируется, ошибка компилятора такая то и т.д.
да я и сам не понимаю в чем проблемма в параметре или в конструкторе.
T>Значит ли это что с данними все в порядке т.е они доходят до БД а запрос не выполняетса T>из за неправилного исползования XMLTYPE(?b) конструктора? T>Спасибо!
Во-первых в запросе ошибка — не хватает одной закрывающей скобки
retcode=SQLQuery (hstmt, "INSERT INTOTEST(FIELD_1) VALUES(XMLTYPE(?b))",pData,&iDataSize);
Во-вторых можно попробовать так
retcode=SQLQuery (hstmt, "INSERT INTO TEST(FIELD_1) VALUES(?b)",pData, &iDataSize)
В-третьих можно увидеть текст ошибки, если после оператора вернувшего ошибку (sqlRet != SQL_SUCCESS || sqlRet != SQL_SUCCESS_WITH_INFO) вызвать SQLGetDiagRec
Здравствуйте, Alexey Frolov, Вы писали:
AF>Во-первых в запросе ошибка — не хватает одной закрывающей скобки AF>retcode=SQLQuery (hstmt, "INSERT INTOTEST(FIELD_1) VALUES(XMLTYPE(?b))",pData,&iDataSize);
извините.
это не скопированный текст(в свое оправдание )
AF>Во-вторых можно попробовать так AF>retcode=SQLQuery (hstmt, "INSERT INTO TEST(FIELD_1) VALUES(?b)",pData, &iDataSize)
Попробую, но FIELD_1 XMLTYPE типа и насколько мне известно нужно использовать XMLTYPE(...).
AF>В-третьих можно увидеть текст ошибки, если после оператора вернувшего ошибку (sqlRet != SQL_SUCCESS || sqlRet != SQL_SUCCESS_WITH_INFO) вызвать SQLGetDiagRec