|
Ошибка при вставке записи в FIBPLus Dataset
|
|||
---|---|---|---|
#18+
Привествую! С днём Победы! Использую Delphi XE5 и FIBPLus 7.5. Пытаюсь вставить данные из формы в базу, вот код: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67.
После отработки процедуры выдается ошибка: Я начинающий, прошу помочь :) Я вычислил, что Делфи материться на первое значение-дату, но не могу понять в чём дело :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2018, 14:17 |
|
Ошибка при вставке записи в FIBPLus Dataset
|
|||
---|---|---|---|
#18+
Logos300, используй подготовленные запросы, читай про параметры. Обычно в датасете SelectSql, InsertSql, UpdateSql, DeleteSql и RefreshSql инициализируются ровно один раз. Если начинающий делай это с помощью мастеров компонентов. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2018, 14:23 |
|
Ошибка при вставке записи в FIBPLus Dataset
|
|||
---|---|---|---|
#18+
Logos300, Про параметризированные запросы тубе указали все правильно, но ошибка, в принципе, в том, что в таком виде вставляемые значения должны быть в кавычках и даты тоже. Причем даты не посто в кавычках, но и в определенном формате. Через параметры поэтому все получается гораздо проще. И отлаживайся в таких случаях на более простых запросах, из двух полей, а не из двадцати двух. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2018, 14:54 |
|
Ошибка при вставке записи в FIBPLus Dataset
|
|||
---|---|---|---|
#18+
Logos300, "вставляемые строковые значения и значения дат должны быть в кавычках". ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2018, 14:58 |
|
Ошибка при вставке записи в FIBPLus Dataset
|
|||
---|---|---|---|
#18+
Logos300 fmFizClients.fbFizClientsDataSet.Insert; научись пользоваться отладчиком. Вот прямо перед ЭТИМ оператором посмотри, что уже находится в insertsql, и насколько оно соответствует SQL. Logos300Я начинающий отладчик, отладчик, и еще раз отладчик. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2018, 23:27 |
|
Ошибка при вставке записи в FIBPLus Dataset
|
|||
---|---|---|---|
#18+
Logos300, 1. Значение 1-го же строкового поля без кавычек, дальше не смотрел. 2. Надо выкинуть это всё, и работать чз параметры, ссылки уже дали. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2018, 23:47 |
|
Ошибка при вставке записи в FIBPLus Dataset
|
|||
---|---|---|---|
#18+
YuRock, На самом деле ссылок не давали. Давали типа умные советы. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2018, 00:13 |
|
Ошибка при вставке записи в FIBPLus Dataset
|
|||
---|---|---|---|
#18+
Наблюдаю в коде нелепое сочетание двух противоположных подходов к работе с базой. Это - использование датасета и вставка записи через его InsertSQL, при том что ввод данных производится из НЕ DataAware-контролов. Да еще и из другой формы. Да еще и перезаписывая этот самый InsertSQL каждый раз новым текстом, да еще и без параметров. Я исповедую отказ от DataAware подхода. Поэтому я бы положил прямо на форму TfmAddNewFizClient компоненты транзакции и QIns : TFIBQuery (который НЕ датасет), и выполнял запрос непосредственно тут. После закрытия текущей формы мы скорее всего попадаем в fmFizClients, посему функция которая создает открывает и выполняет окно fmAddNewFizClient у меня возвращает True/False, где True - запись вставлена, соответственно по выходу список нужно отрефрешить. В var-парамере можно передать обратно и код вставленной записи что бы отрефрешив можно было спозиционироваться на только что вставленную запись. Переменные которые тут заводятся - нафиг не нужны. Удобства не добавляют. Текст SQL-запроса заполняется на стадии DesignTime и в RunTime не изменяется. Соответственно, метод выглядел бы примерно так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Дальше есть вопросы к именованию компонент. Какие-то контролы начинаются с "ed"? какие-то с "med" а какие-то с "m" - нет единообразия. Дату я бы вводил и сохранял не текстом а датой, это позволит как минимум отфильтровать какой-нибудь бред еще на стадии ввода. Многострочные данные я бы в varchar так сразу не пихал. А они вообще нужны, многострочные? (это я предполагаю что компоненты типа mLiveAdress - это не Edit а Memo). Обработки ошибок тут так же нет. Текст запроса в компоненте выглядит так: QIns.SQL = Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Имя формы и компонента запроса указываю в первой строке для того что бы потом в таблицах мониторинга было проще ориентироваться откуда этот запрос выполняется. В запросе сначала получается новый ID (имя генератора вставлено от балды), запись вставляется, а ID возвращается обратно. Сейчас есть такая штука как RETURNING, но я не использую. Поддерживает ли эту штуку FIB+ - не в курсе. Сразу про будущие грабли. Юзер может ввести в поле текст длиннее чем поле в базе - при вставке возникнет исключение. Лучше всего прямо в Edit ограничить максимальную длину разрешенную для ввода, через Edit. Формы создания я не использую. Вставка записи у меня производится пустой, а потом она открывается на редактирование, с чтением данных из базы. А в запросе чтения можно прочитать длину поля и ограничить Edit, примерно такой процедурой Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9.
Ну и так далее. Удачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2018, 04:26 |
|
|
start [/forum/topic.php?fid=40&msg=39642348&tid=1561119]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
61ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 156ms |
0 / 0 |