Текущий архив: 2003.05.29;
Скачать: CL | DM;
Вниз
SQL запрос, TParameters и приведение типов Variant Найти похожие ветки
← →
Zergling (2003-05-05 07:20) [0]День добрый уважаемые коллеги! Возник ткой вопросец.
В ADOQuery.SQL гружу такой запрос:
Select * From Debt Where Debt > Долг
Долг - это не поле таблицы => Долг заносится в ADOQuery.Parameters
// Значения присвоенные как число и как текст воспринимются наура
DataModule_DB.ADOQuery.Parameters.Items[I].Value := 10;
DataModule_DB.ADOQuery.Parameters.Items[I].Value := "10";
// А, при таком подоходе вываливется ошибка о несовместимости типов в условии отбора (т.е. наверно при работе с Variant)
DataModule_DB.ADOQuery.Parameters.Items[I].Value :=
FormCompletionSQL.ValueListEditor.Values[FormCompletionSQL.ValueListEditor.Keys[I]];
// C приведением типов вриантов знаком, все будет нормально если указать
DataModule_DB.ADOQuery.Parameters.Items[I].Value :=
Integer(...);
// Но, это когда я точно знаю какой тип поля обрабатывается по запросу. Я ведь могу написать более сложный запрос и незнать к какому типу отностится обрбатывемое поле. Как же быть, не стряпать же мне для каждого запроса отдельную форму.
// Пробовал привести типы и таким методом, но не лечиться.
DataModule_DB.ADOQuery.Parameters.Items[I].Value :=
DataModule_DB.ADOQuery.Parameters.Items[I].Value.varOleStr(FormCompletionSQL.ValueListEditor.Values[FormCompletionSQL.ValueListEditor.Keys[I]]);
// и так
DataModule_DB.ADOQuery.Parameters.Items[I].Value :=
DataModule_DB.ADOQuery.Parameters.Items[I].Value.StringToOleStr(FormCompletionSQL.ValueListEditor.Values[FormCompletionSQL.ValueListEditor.Keys[I]]);
Помогите мне с ними подружиться! Зарние спсибо за оказанную помощь.
P.S. Думаю, что я ясно изложил суть своей проблемы, но если чего то неясно спрашивайте :-)
← →
Соловьев (2003-05-05 09:41) [1]
Select * From Debt Where Debt > :Долг
with ADOQuery do
begin
Close;
ParamByName("Долг").AsInteger := 10;
Open;
end;
← →
Zergling (2003-05-05 09:58) [2]Где вы люди добрые? Откликнитесь!!!
← →
Zergling (2003-05-05 10:00) [3]Соловьев © (05.05.03 09:41)
Я выше написал, что такое прокатывает когда точно известен тип поля, а что делать когда точно не известен тип поля?
← →
Соловьев (2003-05-05 10:06) [4]
> когда точно не известен тип поля?
это как? ты же структуру должен знать как свои пять пальцев...Хотя всякое бывает...
> // Но, это когда я точно знаю какой тип поля обрабатывается
> по запросу. Я ведь могу написать более сложный запрос и
> незнать к какому типу отностится обрбатывемое поле. Как
> же быть, не стряпать же мне для каждого запроса отдельную
> форму.
как такое может быть не понятно...
← →
Zergling (2003-05-05 11:04) [5]Соловьев © (05.05.03 10:06)
// Если в программе на прямую писать передаваемое значения как число и как текст, то в обеих вариантах запрос выполняется корректно. Здесь же я конкретно не указываю к какому типу для поля привести значение.
DataModule_DB.ADOQuery.Parameters.Items[I].Value := 10;
DataModule_DB.ADOQuery.Parameters.Items[I].Value := "10";
// Возникает вопрос, почему такое не проходит при пресвоеннии переменной типа String из TValueListEditor.
В инспекторе объектов у Parameters.Items[I].Value есть подсвойство Type которое по умолчанию = OleStr. Так вот наверное мне нужно корректно передать String, как OleStr (т.е. получается правильно привести типы Variant). Как это релизовать. Методы описнные выше не помогают.
← →
WarLord (2003-05-05 13:12) [6]Приводи значение параметра к типу соответствующего поля ADOQuery
← →
Zergling (2003-05-05 13:48) [7]WarLord © (05.05.03 13:12)
> Приводи значение параметра к типу соответствующего поля ADOQuery
Ты емеешь ввиду, что реализовть это нужно по примеру Соловьева © и ни как иначе, по другому реализовать это невозможно.
← →
WarLord (2003-05-05 14:45) [8]Zergling ©
Можешь сделать конечно проверку типа поля
case DataModule_DB.ADOQuery.Fields[i].FieldType of
ftString: ....
ftInteger: ....
.........
end;
← →
Соловьев (2003-05-05 14:58) [9]
> Zergling (05.05.03 07:20)
приведи мне задачу когда ты можешь работать с БД, но не зная при этом е структуру?
← →
sniknik (2003-05-05 15:07) [10]Соловьев © (05.05.03 14:58)
в 1С это сплош и рядом. ;о))
← →
Соловьев (2003-05-05 15:09) [11]
> sniknik © (05.05.03 15:07)
с 1С не работал, но если это правда, то это геморой еще тот....
← →
Zergling (2003-05-07 12:33) [12]Здравствуйте, еще раз!
Надумал тут один не стандартный подход к этому делу:
Для заполения параметров SQL запроса использую TValueListEditor
Имеем запрос Select * From Debt Where Debt > Долг
Долг - соответсвенно переменная. После ввода пользователя значения для переменной "Долг" (строка), произвожу поиск в тексте SQL запроса строки Долг и заменяю ее на значение введенное пользовтелем. Далее отредактировнный запрос запускю на выполнение.
Плюсы данного метода - одна форма заполения праметров для большенства SQL зпросов.
Минус: Пользователю нужно было ввести 482, но опечатка 4/2 => по запросу отправится не 482, 2 (мы ведь не знаем точно к какому типу поля присваивет знчение переменная Долг). Так что, для оперций вставки, удаления и т.п. такой метод применять наверно опасно.
В моем проекте в большей степени преобладают простенькие SQL запросы для просмотра данных, так что кучка мелких форточек из моего проекта згинуло. Т.к. SQL запросами я занимюсь очень мало, так что, кто знает сколько еще граблей можно насобирать эксплуатируя такой метод. С одной стороны многое для меня упростилось, а с другой стороны, есть такого рода подводные камни описанные выше.
← →
sniknik (2003-05-07 13:06) [13]Zergling © (07.05.03 12:33)
незамеченный минус -
число тебе нужно будет вводить
так 123
дробное так 12,3 или 12.3 //в зависимости от настроек
строку так "123"
дату #12/03/2003# или #12.03.2003# или ... //в зависимости от настроек
а ведь вроде вопрос изначально состоял в том чтобы был ввод когда "не известен тип поля", передумал? или переложиш ответственность на бедного юзера?
(так ты не подружишся с SQL а в конец разругаешся :-)
p.s. параметры это верный вариант. просто подучи работу с ними.
← →
Zergling (2003-05-07 13:23) [14]Да, по очень малому опыту работы с SQL упустил это из виду.
Хоть там, где используются целые числа и строки это можно использовать. Хоть сколько то форм в проекте будет меньше.
Так, что опять несколько формочек предется восстновить :-(.
← →
Zergling (2003-05-08 08:45) [15]Снова привет!
Кажися добил это дело! Я зациклился на всяких OleStr, а в итоге совместимым оказался OleVariant (столько времени грохнул на это дело). Так что с приведением типов всетаки удалось подружиться.
sniknik © (07.05.03 13:06)
После твоих высказываний про дату, вчера заного восстанавливал несколько форм, а сегодня с утречка чудом добив это дело (приведение типов Variant) снова убил эти формы. Надеюсь больше мне не будет обходимости к ним возвращаться :-)
Т.к. подобные вопросы (приведение типов) в форумах попадаются не раз, то бросил это дело в кладовку.
http://www.delphimaster.ru/cgi-bin/download.pl?get=1052368307&n=1
Страницы: 1 вся ветка
Текущий архив: 2003.05.29;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.007 c