Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передача sql-запроса из программы в PL/SQL developer


Страницы:   1 2

>|< ©   (2011-05-05 13:12:00) 

Кто сталкивался с такой проблемой, прошу помочь.
Есть вот такой код, но он не работает:

procedure SendToPLSQLDev(Q: TOracleQuery);
var MHandle, WHandle: THandle;
   Data: Pointer;
   Size: Integer;
   S, Exe, Param: string;
   i: Integer;
   v: Variant;
procedure AddString(SubString: string);
begin
  S := S + SubString + #0;
end;
begin
//  PLSQLDevMsg := RegisterWindowMessage(PLSQLDevId);
 // Build the string that is going to get transmitted to PL/SQL Developer
 S := '';
 AddString('Direct Oracle Access');       // First an application name
 AddString(QueryName);                    // Object name
 AddString(Q.SQL.Text);                   // The query text
 for i := 0 to Q.VariableCount - 1 do     // and the variables
 begin                                    //   name, type and value
   AddString(Q.VariableName(i));
   AddString(IntToStr(Q.VariableType(i)));
   v := Q.GetVariable(Q.VariableName(i));
   if VarIsNull(v) or VarIsEmpty(v) then AddString('') else AddString(string(v));
 end;
 Size := Length(S);
 // Create a block of shared memory
 MHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, Size, PLSQLDevId);
 if MHandle <> 0 then
 begin
   Data := MapViewOfFile(MHandle, FILE_MAP_WRITE, 0, 0, Size);
   if Data <> nil then
   begin
     Move(S[1], Data^, Size);
     // Send a message that a query is available
     WHandle := FindWindow('TPLSQLDevForm', nil);
     // If not active, try to wake him up
     if WHandle = 0 then
     begin
       Exe := ReadRegString(HKEY_CLASSES_ROOT, 'PL/SQL Developer\Shell\Open\Command', '');
       Param := Q.Session.LogonUsername + '/' + Q.Session.LogonPassword;
       if Q.Session.LogonDatabase <> '' then Param := Param + '@' + Q.Session.LogonDatabase;
       WinExec(PChar(Exe + ' userid=' + Param), SW_SHOWNORMAL);
       Sleep(500); // Give PL/SQL Developer a moment
       WHandle := FindWindow('TPLSQLDevForm', nil);
     end;
     if WHandle <> 0 then SendMessage(WHandle, PLSQLDevMsg, wm_QueryAvailable, Size);
     UnmapViewOfFile(Data);
   end;
   CloseHandle(MHandle);
 end;
end;

Посмотрел под отладчиком, окно TPLSQLDevForm находится
ему отправляется SendMessage(WHandle, PLSQLDevMsg, wm_QueryAvailable, Size);
Но фактически ничего не происходит.
Кто знает, в чем может быть проблема? В каком направлении копать?

Заранее благодарен.


clickmaker   (2011-05-10 15:56:00) [21]

> Цель - вытащить все sql-запросы из программы и записать
> их в БД.

а зачем для этого гуй скл-девелопера? прямо в базу нельзя писать?


&gt;|&lt;   (2011-05-10 15:54:00) [22]


> а сам PL/SQL Developer не может их генерировать

может. и не только он может.


> нужда/желание это не цель.

Цель - вытащить все sql-запросы из программы и записать их в БД.
Собирать запросы буду в рантайме, пройдясь по всем компонентам доступа к БД на открытой форме.
Эта фича нужна как неосновная, чтобы можно было передать в девелопер для доработки запроса напильником в случае необходимости.

Потом все запросы заменю на их номера, напишу ф-цию в БД, которая по номеру запроса будет открывать курсор на соответствующий запрос.


&gt;|&lt;   (2011-05-10 15:50:00) [23]


> попробуй сделать проще - найти окно этого "PL/SQL developer",
>  в нем найти дочернее memo, и в него, в это дочернее memo,
>  WM_SETTEXT'ом передать текст запроса.

да, так и думал сделать.
но для начала нужно программно создать в девелопере новое SQL-окно и тогда уже передавать через WM_SETTEXT

увы, не силен в винапи(
как найти окно - смогу, а как нажать пункт главного меню "Файл/Создать/SQL окно" - не знаю.


&gt;|&lt;   (2011-05-10 15:45:00) [24]


> а, понял, вроде
> написана вспомогательная программка для генерации sql запросов,
>
> и лень сделать ctrl-c из нее и ctrl-v в PL/SQL Developer,
>
> и хочется сразу что бы сама передавала.
> так?

так


Cobalt   (2011-05-10 14:14:00) [25]

попробуй сделать проще - найти окно этого "PL/SQL developer", в нем найти дочернее memo, и в него, в это дочернее memo, WM_SETTEXT'ом передать текст запроса.


MsGuns   (2011-05-06 10:30:00) [26]

Идейка жиденькая какая-то, да и реализация, очевидно, убогенькая :)


OW   (2011-05-06 10:28:00) [27]


> э... а сам PL/SQL Developer не может их генерировать?

ну, делфя помощнее будет в работе с строками


sniknik   (2011-05-06 10:06:00) [28]

> вспомогательная программка для генерации sql запросов
э... а сам PL/SQL Developer не может их генерировать? их же сейчас только ленивый не "генерирует"...


OW   (2011-05-06 10:04:00) [29]

а, понял, вроде
написана вспомогательная программка для генерации sql запросов,
и лень сделать ctrl-c из нее и ctrl-v в PL/SQL Developer,
и хочется сразу что бы сама передавала.
так?


sniknik   (2011-05-05 19:33:00) [30]

> Мне нужно
нужда/желание это не цель.


&gt;|&lt;   (2011-05-05 17:02:00) [31]


> или не то вообще?

не то.

Мне нужно по нажатию кнопки скопировать в PL/SQL Developer из мой программы, которой я буду этот запрос составлять


OW   (2011-05-05 16:55:00) [32]


> а как иначе?

не понял, что преследуешь. Цель какая?

если слежу за своими прграммами, то в ODAC есть
   omon1: TOraSQLMonitor;
у него есть св-во onSQL
и все запросы программы тут, тупо в мемо их, там и параметры и значения их
скопировать в PL/SQL Developer да F8 нажать..

чужие через
SQLMonitor.exe (OCIHook.dll)
отлавливаются, скопировать в PL/SQL Developer да F8 нажать..

или не то вообще?


&gt;|&lt;   (2011-05-05 15:56:00) [33]

есть еще такие константы:
const // PL/SQL Developer interface
 QueryName: string         = '';
 PLSQLDevId                = 'PLSQLDevInterface';
 PLSQLDevMsg: Cardinal     = 0;
 wm_QueryAvailable         = 1000;
 wm_PLSQLDevQueryAvailable = 1001;


&gt;|&lt;   (2011-05-05 15:54:00) [34]


> а для чего это все?

а как иначе?


> что тут передается? - SendMessage(WHandle, PLSQLDevMsg,
> wm_QueryAvailable, Size);

да, только заметил что
//  PLSQLDevMsg := RegisterWindowMessage(PLSQLDevId);
и не совсем понятно, как сам запрос из
Data := MapViewOfFile(MHandle, FILE_MAP_WRITE, 0, 0, Size);
попадет в  PLSQLDev...


OW   (2011-05-05 14:07:00) [35]

а для чего это все?


clickmaker   (2011-05-05 13:16:00) [36]

> Но фактически ничего не происходит.

а что должно происходить?

что тут передается? - SendMessage(WHandle, PLSQLDevMsg, wm_QueryAvailable, Size);


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо