Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
14-95075
Step[B.M.]
2003-05-10 15:41
2003.05.29
Где в Inete можно найти примеры создания процедур, триггеров IB


14-95027
АлексейК
2003-05-13 13:52
2003.05.29
Процессор+Винт+Опративка = Мозг?


3-94756
Dimaz-z
2003-05-11 21:31
2003.05.29
Почему при удалении записей, размер базы не уменьшается?


3-94667
Петров Денис
2003-05-12 09:48
2003.05.29
Timeout expired


1-94931
Max123
2003-05-17 18:07
2003.05.29
Сaption!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский