![]() |
|
![]() ![]() ![]() |
|
Janger |
|
|||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 17.6.2013 Репутация: нет Всего: 1 |
В общем дело такое.
Есть SQL таблица, там уже имеется 26 записей. Мне необходимо дополнять от 27 и выше. Я написал такой код.
Что происходит: 1) Я нажимаю на кнопку 2) ![]() 3) До этого заполненная таблица DBGrid1, тут же пустеет. 4) Я выхожу из программы, опять DBGrid1 заполнена. Только уже с тестом SI на 27 месте. ___________________ Как исправить? Подскажите((( |
|||
|
||||
Antimol |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 28.7.2007 Где: Украина, Киев Репутация: 4 Всего: 4 |
1. Скорее всего БД MS SQL Server.
2. Код мог бы выглядеть как то так (код написано в слепую, но принцип сохранился):
3. Колонку ID можно создать как поле AutoIncrement тогда оно само будет подставляться, и не надо будет в коде указывать что ID = 27, а опустить его. 4. Ошибка говорит сама за себя, скорее всего полю Name установлено свойство первичного ключа (в таком случае не ясно зачем вообще ID, на Name можно было повесить только констрейнт на уникальность) и при вставке данных он говорит что запись с таким именем уже существует. Это сообщение отредактировал(а) Antimol - 11.10.2013, 12:23 --------------------
Лучшее спасибо это "+" к репутации. Мой блог: ИНФОРМАТИЗАЦИЯ, и mirsovetov.net. Написание программ, исправление ошибок, статьи.... |
|||
|
||||
Vas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 29.6.2005 Где: Stavropol region Репутация: 23 Всего: 28 |
Там же сказано что значение дубликата 27. Причем здесь первичный ключ по name. Скорее всего Autoincrement на поле id уже установлен, но не факт. Janger, попробуй вставить запись без использования ID
И при получении ошибок такого типа, неплохо бы выбирать все записи в БД и смотреть значение первичного ключа. -------------------- И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин) |
|||
|
||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 3 Всего: 133 |
Чем это принципиально отличается от кода, предложенного ТС? Ошибка эта все-равно выскачет.
Janger, в тексте ошибки все более чем очевидно. Какие могут быть вопросы? -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
Antimol |
|
||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 28.7.2007 Где: Украина, Киев Репутация: 4 Всего: 4 |
Скорее всего да, ошибку не дочитал до конца =). 1. Если уже пишем, так пишем так чтобы не попадать на сайт МегаКод 2. Для выполнения некого запроса мы каждый раз будем обращаться к DataModule2.ADOQuery1? Может возникнуть ситуация что будет выполнен запрос select, а потом insert и что в результате? У нас возникнет ситуация при которой данные с Grid'a исчезнут, если DataModule2.ADOQuery1 конечно подвязан к нему. 3. Запрос с параметрами намного лучше чем конструкция вида:
Если у нас в названии слово si'so тогда будет свал. 4. Вообще не понятная конструкция. Скорее всего выполнит один и тот же запрос 2 раза. (нужно проверить, если это так то из за этого и появляется ошибка)
5. Минимизация кода
можно заменить просто на:
PS: Попался крупный проект который был написан в таком духе (>400 форм + куча г.кода и копипаста). Когда вижу что то подобное, стараюсь подсказать как лучше, конечно с моей точки зрения. =) --------------------
Лучшее спасибо это "+" к репутации. Мой блог: ИНФОРМАТИЗАЦИЯ, и mirsovetov.net. Написание программ, исправление ошибок, статьи.... |
||||||||
|
|||||||||
Vas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 29.6.2005 Где: Stavropol region Репутация: 23 Всего: 28 |
Вот с таким кодом вы тоже на указанный вами сайт попадете. Что будет если приложение Ваше свалится, не попав в секцию Free? Добавлено через 2 минуты и 1 секунду Может все-таки стоит писать
-------------------- И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин) |
|||
|
||||
Antimol |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 28.7.2007 Где: Украина, Киев Репутация: 4 Всего: 4 |
Будет утечка памяти только в том случае если в момент создания объекта TADOQuery.Create(nil) произойдет свал. Если свал произойдет после создания, тогда мы попадаем в секцию try .. funally end; которая гарантировано вызовет Free в любом случае независимо оттого, что произойдет в предложении Try; Грубо говоря код можно представить так:
Так не всегда получится и нужно. (У нас должен передаваться в Self - TComponent, мы можем написать модуль в котором есть метод с похожим кодом, который просто выполняет неким запрос с параметрами, тогда нужно будет передавать Self вместе со всеми параметрами) Я сам создал объект и хочу его уничтожить после использования, мне не надо чтобы он висел до конца завершения программы. --------------------
Лучшее спасибо это "+" к репутации. Мой блог: ИНФОРМАТИЗАЦИЯ, и mirsovetov.net. Написание программ, исправление ошибок, статьи.... |
|||
|
||||
Poseidon |
|
||||||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 3 Всего: 133 |
Ну конечно. Тогда уже до конца нужно сравнивать:
или
Но смысл моего предыдущего поста был не в том. Вопрос читали? Вникли? А теперь ответьте, каким боком можно прилепить Ваш ответ к той ошибке, что вылетает у автора? Это похоже на диалог: - Слушай, заливаю из канистры в бензиновый двигатель диз. топливо, а машина не едет. Что может быть не так? - С канистры лучше не заливать, едь на заправку. Надеюсь смысл понятен. Добавлено через 2 минуты и 33 секунды Это как же надо так изловчиться, что бы свалиться на строке
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
||||||
|
|||||||
Antimol |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 28.7.2007 Где: Украина, Киев Репутация: 4 Всего: 4 |
Попробуйте передать вместо "Name" => "Na'me" и увидем результат после выполнения. Если добавить к примеру в AdoQuery запрос тогда можно обращаться к параметрам без их явного создания. Скорее всего сделать свою обертку и в конструкторе, что то накрутить, было бы желание =), бывают такие перлы в коде попадаются что никогда не подумал бы. В общем ответ скрывался в 4.-м пункте, но он скорее всего не верный, наверняка нужно удалить строчки
и все заработает, правда уже с другим номером (ИД) Это сообщение отредактировал(а) Antimol - 11.10.2013, 16:41 --------------------
Лучшее спасибо это "+" к репутации. Мой блог: ИНФОРМАТИЗАЦИЯ, и mirsovetov.net. Написание программ, исправление ошибок, статьи.... |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Базы данных и репортинг" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |