Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Базы данных и репортинг > Добавление стоки в SQL |
Автор: Janger 9.10.2013, 13:42 | ||
В общем дело такое. Есть SQL таблица, там уже имеется 26 записей. Мне необходимо дополнять от 27 и выше. Я написал такой код.
Что происходит: 1) Я нажимаю на кнопку 2) http://%5BURL=http://s1.ipicture.ru/Gallery/Viewfull/31906604.html]Скриншот выплывающей ошибки[/url] 3) До этого заполненная таблица DBGrid1, тут же пустеет. 4) Я выхожу из программы, опять DBGrid1 заполнена. Только уже с тестом SI на 27 месте. ___________________ Как исправить? Подскажите((( |
Автор: Antimol 9.10.2013, 15:37 | ||
1. Скорее всего БД MS SQL Server. 2. Код мог бы выглядеть как то так (код написано в слепую, но принцип сохранился):
3. Колонку ID можно создать как поле AutoIncrement тогда оно само будет подставляться, и не надо будет в коде указывать что ID = 27, а опустить его. 4. Ошибка говорит сама за себя, скорее всего полю Name установлено свойство первичного ключа (в таком случае не ясно зачем вообще ID, на Name можно было повесить только констрейнт на уникальность) и при вставке данных он говорит что запись с таким именем уже существует. |
Автор: Poseidon 9.10.2013, 22:34 |
Чем это принципиально отличается от кода, предложенного ТС? Ошибка эта все-равно выскачет. Janger, в тексте ошибки все более чем очевидно. Какие могут быть вопросы? |
Автор: Antimol 11.10.2013, 12:22 | ||||||||
Скорее всего да, ошибку не дочитал до конца =). 1. Если уже пишем, так пишем так чтобы не попадать на сайт http://govnokod.ru/pascal 2. Для выполнения некого запроса мы каждый раз будем обращаться к DataModule2.ADOQuery1? Может возникнуть ситуация что будет выполнен запрос select, а потом insert и что в результате? У нас возникнет ситуация при которой данные с Grid'a исчезнут, если DataModule2.ADOQuery1 конечно подвязан к нему. 3. Запрос с параметрами намного лучше чем конструкция вида:
Если у нас в названии слово si'so тогда будет свал. 4. Вообще не понятная конструкция. Скорее всего выполнит один и тот же запрос 2 раза. (нужно проверить, если это так то из за этого и появляется ошибка)
5. Минимизация кода
можно заменить просто на:
PS: Попался крупный проект который был написан в таком духе (>400 форм + куча г.кода и копипаста). Когда вижу что то подобное, стараюсь подсказать как лучше, конечно с моей точки зрения. =) |
Автор: Vas 11.10.2013, 14:20 | ||
Вот с таким кодом вы тоже на указанный вами сайт попадете. Что будет если приложение Ваше свалится, не попав в секцию Free? Добавлено через 2 минуты и 1 секунду Может все-таки стоит писать
|
Автор: Antimol 11.10.2013, 15:08 | ||
Будет утечка памяти только в том случае если в момент создания объекта TADOQuery.Create(nil) произойдет свал. Если свал произойдет после создания, тогда мы попадаем в секцию try .. funally end; которая гарантировано вызовет Free в любом случае независимо оттого, что произойдет в предложении Try; Грубо говоря код можно представить так:
Так не всегда получится и нужно. (У нас должен передаваться в Self - TComponent, мы можем написать модуль в котором есть метод с похожим кодом, который просто выполняет неким запрос с параметрами, тогда нужно будет передавать Self вместе со всеми параметрами) Я сам создал объект и хочу его уничтожить после использования, мне не надо чтобы он висел до конца завершения программы. |
Автор: Poseidon 11.10.2013, 16:17 | ||||||
Ну конечно. Тогда уже до конца нужно сравнивать:
или
Но смысл моего предыдущего поста был не в том. Вопрос читали? Вникли? А теперь ответьте, каким боком можно прилепить Ваш ответ к той ошибке, что вылетает у автора? Это похоже на диалог: - Слушай, заливаю из канистры в бензиновый двигатель диз. топливо, а машина не едет. Что может быть не так? - С канистры лучше не заливать, едь на заправку. Надеюсь смысл понятен. Добавлено через 2 минуты и 33 секунды Это как же надо так изловчиться, что бы свалиться на строке
|
Автор: Antimol 11.10.2013, 16:40 | ||
Попробуйте передать вместо "Name" => "Na'me" и увидем результат после выполнения. Если добавить к примеру в AdoQuery запрос тогда можно обращаться к параметрам без их явного создания. Скорее всего сделать свою обертку и в конструкторе, что то накрутить, было бы желание =), бывают такие перлы в коде попадаются что никогда не подумал бы. В общем ответ скрывался в 4.-м пункте, но он скорее всего не верный, наверняка нужно удалить строчки
и все заработает, правда уже с другим номером (ИД) |
Автор: Akella 12.10.2013, 13:10 |
Тебе перевести было сложно? |