![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача sql-запроса из программы в PL/SQL developer
>|< © (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-запросы из программы и записать
> их в БД.
а зачем для этого гуй скл-девелопера? прямо в базу нельзя писать?
>|< (2011-05-10 15:54:00) [22]
> а сам PL/SQL Developer не может их генерировать
может. и не только он может.
> нужда/желание это не цель.
Цель - вытащить все sql-запросы из программы и записать их в БД.
Собирать запросы буду в рантайме, пройдясь по всем компонентам доступа к БД на открытой форме.
Эта фича нужна как неосновная, чтобы можно было передать в девелопер для доработки запроса напильником в случае необходимости.
Потом все запросы заменю на их номера, напишу ф-цию в БД, которая по номеру запроса будет открывать курсор на соответствующий запрос.
>|< (2011-05-10 15:50:00) [23]
> попробуй сделать проще - найти окно этого "PL/SQL developer",
> в нем найти дочернее memo, и в него, в это дочернее memo,
> WM_SETTEXT'ом передать текст запроса.
да, так и думал сделать.
но для начала нужно программно создать в девелопере новое SQL-окно и тогда уже передавать через WM_SETTEXT
увы, не силен в винапи(
как найти окно - смогу, а как нажать пункт главного меню "Файл/Создать/SQL окно" - не знаю.
>|< (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]> Мне нужно
нужда/желание это не цель.
>|< (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 нажать..
или не то вообще?
>|< (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;
>|< (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);