Страница 1 из 1
Прямой SQL
Добавлено: 13 апр 2009, 05:00
Hmyrii
Всем доброго времени суток.
Пришло желание начать активно использовать прямой sql. Все заявленные в доке функции вроде работают. Начинаешь писать запрос, не просто так, а настоящий запрос, чтобы одним маневром получить уже готовые данные, фильтрованые, групированые, агрегирование ... запрос получается ЗАЧЕТНЫМ. И тут то вылезает одно такое неприятное НО. Этот запрос не фига не влазиет в переменную типа string так как ее длина ограничена жалкими 255 символами.
Как же быть, может кто нить просветить?
Может я чего то незнаю?
В противном случае не вижу не малейшего смысла от этого прямого SQL если туда не удается протиснуть даже мало мальский запросик.
Добавлено: 13 апр 2009, 08:51
Nikos
А если использовать представления в БД?
Добавлено: 13 апр 2009, 11:00
Ged
Код: Выделить всё
sqlAddStr(str_handle ,'Select ');
sqlAddStr(str_handle ,'* ');
sqlAddStr(str_handle ,'From ');
sqlAddStr(str_handle ,'X$tables ');
Добавлено: 14 апр 2009, 04:31
Hmyrii
sqlAddStr пожалуй должен был мне помочь но вот что то не выходит
есть такая процедура, она работает без проблем
Код: Выделить всё
procedure ExampleSELECT1;
{
var stmt : longInt;
var query : string;
var field1 : string;
// разместить хэндл под запрос
stmt := sqlAllocStmt;
// подготовим запрос
query := '';
query := query + 'select Lschet.TabN ';
query := query + 'from ';
query := query + 'Lschet ';
sqlPrepare(stmt, query);
sqlBindCol(stmt, 1, field1);
// выполним запрос
sqlExecute(stmt);
// прогоним выбраные записи
while (sqlFetch(stmt) = tsOk)
LogStrToFile(logFile, field1);
// осбоводим хэндл
sqlFreeStmt(stmt);
}
а вот попытался сделать используя slqAddStr, не допер что то как ее коректно, использовать, на выходе не чего нет
Код: Выделить всё
procedure ExampleSELECT2;
{
var stmt : longInt;
var str_handle : longInt;
var query : string;
var field1 : string;
// разместить хэндл под запрос
stmt := sqlAllocStmt;
// подготовим запрос
sqlFreeStmt(str_handle);
sqlAddStr(str_handle, 'select Lschet.TabN ');
sqlAddStr(str_handle, 'from ');
sqlAddStr(str_handle, 'Lschet ');
// привяжем поле
sqlBindCol(stmt, 1, field1);
// выполним запрос
sqlExecute(stmt);
// покажем данные
while (sqlFetch(stmt) = tsOk)
LogStrToFile(logFile, field1);
sqlFreeStmt(stmt);
}
может кто имеет опыт использования этой ф-ции и поделится рабочим кодом?
Добавлено: 14 апр 2009, 04:34
Hmyrii
использовать представления в БД считаю не очень удобным, так как при разработке и отладки отчета придется постоянно дергать админов заказчика чтобы они пересоздавали VIEW по мере того как я ее буду сначала отлаживать а потом развивать и усовершенствовать
Добавлено: 14 апр 2009, 08:28
Nikos
В этом случае, конечно, вы правы. Это у нас один человек на все - вот я и работаю через представления...
Добавлено: 14 апр 2009, 11:28
Den
Hmyrii писал(а):...а вот попытался сделать используя slqAddStr, не допер что то как ее коректно, использовать, на выходе не чего нет
Код: Выделить всё
procedure ExampleSELECT2;
{
var stmt : longInt;
var str_handle : longInt;
var query : string;
var field1 : string;
// разместить хэндл под запрос
stmt := sqlAllocStmt;
// подготовим запрос
sqlFreeStmt(str_handle);
sqlAddStr(str_handle, 'select Lschet.TabN ');
sqlAddStr(str_handle, 'from ');
sqlAddStr(str_handle, 'Lschet ');
// привяжем поле
sqlBindCol(stmt, 1, field1);
// выполним запрос
sqlExecute(stmt);
// покажем данные
while (sqlFetch(stmt) = tsOk)
LogStrToFile(logFile, field1);
sqlFreeStmt(stmt);
}
может кто имеет опыт использования этой ф-ции и поделится рабочим кодом?
Вроде sqlPrepare(stmt, str_handle) забыли просто
Добавлено: 14 апр 2009, 12:21
Hmyrii
Den писал(а):
Вроде sqlPrepare(stmt, str_handle) забыли просто
хотел уж было написать про то что вы не внимательно читали хелп, что у данной ф-ции первый параметр это хэндл (longint), а второй это запрос (string)
а потом думаю ... а дай попробуй залепить ей туда вместо запроса хэндл на запрос ... а в голове мысль "только зря время потрачу, в доке же ясно написано" ...
и прокатило, вот большое спасибо за явно неординарный ответ
Добавлено: 23 апр 2009, 13:52
Vik
Кто-нибудь, может, пробовал использовать DSQL на Pervasive? Возможно ли вообще это сделать?
Добавлено: 23 апр 2009, 18:34
LaaLaa
Vik писал(а):Кто-нибудь, может, пробовал использовать DSQL на Pervasive? Возможно ли вообще это сделать?
Для первасива подерки DSQL в интсрументарии нет.
Добавлено: 23 апр 2009, 19:09
Vik
В документации смущает такая фраза:
Код: Выделить всё
"Однако на Pervasive SQL доступ через прямой SQL и доступ через классический интерфейс идет через разные коннекты (разные сервисы). В результате доступ через разные механизмы к одним и тем же данным будет приводить к взаимной блокировке. Необходимо учитывать эти особенности при разработке алгоритмов со смешанным типом доступа к данным.
"
То есть, в ней не сказано, что это невозможно..
Добавлено: 23 апр 2009, 19:16
Vik
вопрос снимается..
Добавлено: 14 май 2009, 14:53
TYZ
я прошу прощения, тема для меня новая
где можно взять документацию по direct sql ?
или где почитать?
я так понял что это дает возвожность использовать нормальные sql запросы к примеру в ард отчетах, так?
Добавлено: 01 июл 2009, 11:06
Vik
У меня вопрос. Есть два варианта кода:
1)
Код: Выделить всё
SetVisualHeader('Сохранение настроек'#13''+
'Заполнение таблицы')
_Loop TfUsers {
stmt := sqlAllocStmt;
sqlBindParam(stmt, 1, TfUsers.Obj);
sqlBindParam(stmt, 2, TfUsers.cUser);
sqlExecStmt(stmt, 'SELECT'+
' V.cTune'+
',D.code'+
',V.obj'+
',V.cUser'+
',V.longVal'+
',V.doubleVal'+
',V.dateVal'+
',V.timeVal'+
',V.compVal'+
',V.strVal'+
',V.isEmpty'+
',V.strEmpty'+
' FROM TuneVal as V '+
'inner join TuneDef as D on V.cTune = D.Nrec'+
' WHERE V.Obj = ? AND V.cUser = ?');
sqlFetchInto(stmt, tnTfTunes);
sqlFreeStmt(stmt);
NextVisual;
}
2)
Код: Выделить всё
stmt := sqlAllocStmt;
sqlPrepare(stmt, 'SELECT'+
' V.cTune'+
',D.code'+
',V.obj'+
',V.cUser'+
',V.longVal'+
',V.doubleVal'+
',V.dateVal'+
',V.timeVal'+
',V.compVal'+
',V.strVal'+
',V.isEmpty'+
',V.strEmpty'+
' FROM TuneVal as V '+
'inner join TuneDef as D on V.cTune = D.Nrec'+
' WHERE V.Obj = ? AND V.cUser = ?');
sqlBindParam(stmt, 1, TfUsers.Obj);
sqlBindParam(stmt, 2, TfUsers.cUser);
SetVisualHeader('Сохранение настроек'#13''+
'Заполнение таблицы')
_Loop TfUsers {
sqlExecute(stmt);
sqlFetchInto(stmt, tnTfTunes);
NextVisual;
}
sqlFreeStmt(stmt);
То есть во втором варианте подготавливаю запрос, а потом лишь меняю параметры. По идее второй должен отработать быстрее, так оно и есть. Но вот результаты почему-то совершенно разные. Правильно выбирается только в первом случае, во втором результатов примерно в два раза меньше. Что не так делаю?