Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2011, 11:31   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос Удаление всех строк из БД по значению из колонки

Добрый день! Задача такова. Выбирается колонка, в ней выбирается любое значение и нужно удалить из БД все строки, в которых встречается выбранное значение из указанной колонки. Список колонок DBGridEh`а грузится в RibbonComboBox1, список всех значений выбранной в RibbonComboBox1 колонки грузится в RibbonComboBox2. Не могу понять почему появляется ошибка: "File '*.dbf' dos not exists". Вот код мой:
Код:
procedure TForm1.ActionDeleteRecordExecute(Sender: TObject);
var
 de,r: string;
begin
 de:=Form1.RibbonComboBox2.Text;
 Form1.ADOQuery2.Close;
 Form1.ADOQuery2.SQL.Text:='delete * from ' +   
 Form1.sStatusBar1.Panels[1].Text +
                            ' where ' + Form1.RibbonComboBox1.Text + '="' + de + '"';
 Form1.ADOQuery2.ExecSQL;
end;
Прошу вас указать на мою ошибку. Заранее спасибо за советы.
З.Ы. Кстати, почему-то не очищается RibbonComboBox2 при повторном выборе колонки из RibbonComboBox1.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 17.09.2011, 11:56   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Звездочка (*) после delete зачем? На всякий случай - что в Form1.sStatusBar1.Panels[1].Text?

add

Еще возможный источник будущих ошибок - наличие в de символа "
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 17.09.2011 в 12:03.
Аватар вне форума Ответить с цитированием
Старый 17.09.2011, 12:07   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Аватар, + тебе, спасибо. Да, дело было в звездочке . В Form1.sStatusBar1.Panels[1].Text имя файла (таблицы) БД, которую выбирают в процессе работы с программой. А с кавычками будет работать если в de будет передаваться число, а не строка? Для строки работает.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 17.09.2011, 12:25   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

С кавычками в условии имелось ввиду следующее:
...where pole1="nhf"kz" даст ошибку синтаксиса
Если такая ситуация возможно, то каждую внутреннюю кавычку нужно удваивать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.09.2011, 12:56   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Аватар
...where pole1="nhf"kz" даст ошибку синтаксиса
+1
угу. А если в de написать например, так:
Код:
a" or "" = "

то получим классический SQL Injection - удалятся ВСЕ записи из таблицы!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.09.2011, 07:04   #6
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

А как тогда сделать если у меня в колонке будет вместо строки число какое-то?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 18.09.2011, 11:23   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если поле цифровое там кавычки 100 лет не нужны:
...WHERE Pole1=5
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.09.2011, 11:40   #8
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

А как тогда можно определить число или слово передается в de?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 18.09.2011, 12:24   #9
Surgeon
Форумчанин
 
Регистрация: 04.10.2007
Сообщений: 106
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
А как тогда можно определить число или слово передается в de?
Это определяется при разработке таблицы - типом данных использованным в данном поле.
В принципе в текстовом поле может храниться например значение "80", но это лишь два СИМВОЛА "8" и "0" и обрабатывается SQL-ем как текст.
Обычно это известно при проектировании приложения, но если так уж нужен механизм свободно работающий с произвольно выбранными полями таблицы то можно использовать что-то вроде:
Код:
...
var
choosenfieldname:string; //для обращения к выбранному пользователем полю по имени
choosenfieldindex:integer; //для обращения по индексу
...
if DataSet.FIelds[choosenfieldindex].DataType=ftString then 
 begin
 //здесь формируем запрос с кавычками
 end;
if DataSet.FIelds.FieldByName(choosenfieldname).DataType=ftinteger then 
 begin
 //здесь формируем запрос без кавычек
 end;
...
Я прообовал когда-то сделать универсальный механизм для генерации запроса по произвольно выбранному набору полей, с учетом типов самих полей (тип TFieldKind) - для подстановочных/полей данных/вычисляемых.
Сделал, с значительными ограничениями, без учета вычисляемых. Закончил, потом понял что нужны изменения в структуре базы, поправлять генератор запроса было влом, так и забросил.
Все не так плохо, как вам кажется, на самом деле все гораздо хуже.
http://delphiworld.narod.ru/dw.html - 5000 статей!!! удобный поиск, оффлайн сборник, рекомендую всем
Surgeon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление всех строк из RichEdit, начиная с определённой строки ondar Компоненты Delphi 5 07.06.2011 06:48
Удаление строки по указанному значению в СтрингГриде DgaDga Общие вопросы Delphi 2 02.06.2011 08:53
Удаление строк в массиве по значению в строке ZanderBlack1 Microsoft Office Excel 1 19.01.2011 16:11
Удаление строки по значению FormAlDeGid Microsoft Office Excel 15 18.11.2009 09:38
Выборка строк из таблицы по значению TDBLookupComboBox Gringo БД в Delphi 4 28.10.2008 05:45