1

Тема: Занесення даних в базу даних (Delphi)

У мене проблеми виникли з занесенням у б/д цілого(довгого) числа.
У мене б/д Microsoft Office Access Поле числове у яке заношу роки.
Тип даних:- числовий
Розмір поля:- довге ціле
Значення за замовчуванням відсутні

Спочатку написав так:

ModulA_DMd.Main_ADOTb.FieldByName('Рік').AsInteger:=StrToInt(Yhre_Ed.Text);

Та проблема була в цьому що коли поле Edit не було заповнене то при збережені даних вибивало помилку.

Тоді я написав так:

  if Yhre_Ed.Text<>'' then
    begin
      with ModulA_DMd.Main_ADOTb do
        begin
          FieldByName('Рік').AsInteger:=StrToInt(Yhre_Ed.Text);
        end;
    end;

Заноситься в базу добре, але є один недолік.
Якщо вже в базі даних записаний рік а потрібно його очистити то зробити це не можливо.
Можливо хтось стикався з такими проблемами то підкажіть як це вирішити.  Буду дуже вдячний.

2

Re: Занесення даних в базу даних (Delphi)

Загальне зауваження - не зрозуміло навіщо використовувати цей тип даних для зберігання дати? Чому не використовувати для цього або тип БД або хоч просто символьний тип?
Яку саме помилку ви отримуєте? Може DataSet треба перевести у режим редагування?

Подякували: Romanvolja1

3

Re: Занесення даних в базу даних (Delphi)

З Вами цілком згідний що рік можна заносити в базу в текстове поле це різниці ніякої не відіграє.
Та я цей приклад навів, тому що деколи це необхідно.

Наприклад у мене в базі є колонка де заношу розміри файлів.

Якщо це поле буде текстове тоді сортування не буде відповідати дійсності

наприклад при сортуванню по цьому полі файл 25кб   буде стояти перед 150кб.
тому що в текстовому полі сортування проходить по символам, а не по числам.

4

Re: Занесення даних в базу даних (Delphi)

Romanvolja написав:

З Вами цілком згідний що рік можна заносити в базу в текстове поле це різниці ніякої не відіграє.
Та я цей приклад навів, тому що деколи це необхідно.

Наприклад у мене в базі є колонка де заношу розміри файлів.

Якщо це поле буде текстове тоді сортування не буде відповідати дійсності

наприклад при сортуванню по цьому полі файл 25кб   буде стояти перед 150кб.
тому що в текстовому полі сортування проходить по символам, а не по числам.

:o
так відкрийте ж для себе тип Date :)
до чого тут розміри файлів взагалі? Я зробив вам зауваження для конкретного поля, де ви зберігаєте рік. Де я писав про розмір чи щось інше?
Ви так і не навели - яку саме помилку ви отримуєте?

5

Re: Занесення даних в базу даних (Delphi)

При такому занесені в базу вибиває помилку "is not a valid integer value"

ModulA_DMd.Main_ADOTb.FieldByName('Рік').AsInteger:=StrToInt(Yhre_Ed.Text);

Також і по даті дає помилку

ModulA_DMd.Main_ADOTb.FieldByName('Датаî').AsDateTime:=StrToDateTime(DateChanges_Ed.Text);

але ці помилки є тільки в тому разі, якщо поля(Edit) не заповнені, а якщо заповнені то все нормально

6

Re: Занесення даних в базу даних (Delphi)

Romanvolja
Ну так зробіть перевірку, як в першому повідомленні.

7

Re: Занесення даних в базу даних (Delphi)

Ви повинні перевіряти ВСІ данні які отримуєте від користувача. Та звичайно опрацьовувати ці помилки. Окрім того, у Delphi існує рід компонентів які використовуються саме для вводу у базу даних. Вам потрібно використовувати їх - або самому робити вичитку з бази та заповненя поля редагування. Зверніть будь ласка на це увагу - це компоненти TDBEdit та інші.

Подякували: Torbins, DOP2

8 Востаннє редагувалося Romanvolja (30.01.2017 23:07:30)

Re: Занесення даних в базу даних (Delphi)

Torbins написав:

Romanvolja
Ну так зробіть перевірку, як в першому повідомленні.

У мене так і зроблено так

if Yhre_Ed.Text<>'' then
2.    begin
3.      with ModulA_DMd.Main_ADOTb do
4.        begin
5.          FieldByName('Рік').AsInteger:=StrToInt(Yhre_Ed.Text);
6.        end;
7.    end;

Але проблема не в тому як занести "рік" в базу даних а як його очистити коли він уже там є.

9

Re: Занесення даних в базу даних (Delphi)

Що ви маєте на увазі під "як його очистити"?

10

Re: Занесення даних в базу даних (Delphi)

varkon написав:

Ви повинні перевіряти ВСІ данні які отримуєте від користувача. Та звичайно опрацьовувати ці помилки. Окрім того, у Delphi існує рід компонентів які використовуються саме для вводу у базу даних. Вам потрібно використовувати їх - або самому робити вичитку з бази та заповненя поля редагування. Зверніть будь ласка на це увагу - це компоненти TDBEdit та інші.

Вкладка Data Controls дуже хороші компоненти і при першій можливості їх використовую (задавши їм властивості: DataSource і DataField непотрібно більше нічого писати)

Та у мене в базі даних дуже багато таблиць і складна структура в'язків, а дані в базу даних(в усі таблиці) заношу одночасно одним цоканням по кнопці "Зберегти". Тому на жаль ці компоненти що Ви порадили мені в даному додатку не підходять.

11

Re: Занесення даних в базу даних (Delphi)

varkon написав:

Що ви маєте на увазі під "як його очистити"?

Саме так (коли вже є дата то як її очистити)

12

Re: Занесення даних в базу даних (Delphi)

Ви пишете одні й тіж данні у багато таблиць?
Й як пов'язана помилка "is not a valid integer value" з чисткою даних?

13

Re: Занесення даних в базу даних (Delphi)

varkon написав:

Ви пишете одні й тіж данні у багато таблиць?
Й як пов'язана помилка "is not a valid integer value" з чисткою даних?

З поля Edit заношу в базу:

ModulA_DMd.Main_ADOTb.FieldByName('Рік').AsInteger:=StrToInt(Yhre_Ed.Text);

Якщо поле Edit заповнене (тобто коли там записаний рік) то в базу заноситься все нормально.

Якщо в базі вже є записаний рік і я хочу очистити поле то в Edit нічого не воджу(тобто Edit не заповнений)
Тоді і вибиває помилку "is not a valid integer value" (що невірний тип даних)

14

Re: Занесення даних в базу даних (Delphi)

Romanvolja написав:
varkon написав:

Ви пишете одні й тіж данні у багато таблиць?
Й як пов'язана помилка "is not a valid integer value" з чисткою даних?

З поля Edit заношу в базу:

ModulA_DMd.Main_ADOTb.FieldByName('Рік').AsInteger:=StrToInt(Yhre_Ed.Text);

Якщо поле Edit заповнене (тобто коли там записаний рік) то в базу заноситься все нормально.

Якщо в базі вже є записаний рік і я хочу очистити поле то в Edit нічого не воджу(тобто Edit не заповнений)
Тоді і вибиває помилку "is not a valid integer value" (що невірний тип даних)

Я не розумію що вам заважає прочитати специфікацію функції,яку ви використовуєте? Ви передаєте у функцію  StrToInt значення яке не може бути приведено до числового. В чому у вас проблема?

15

Re: Занесення даних в базу даних (Delphi)

Romanvolja
Ви привели не увесь код. Десь обов'язково має бути вибірка з БД, Post та інше. Окрім того, мені здається, що замість модифікації існуючого рядка, ви створюєте новий з відповідним результатом:

Якщо в базі вже є записаний рік і я хочу очистити поле то в Edit нічого не воджу(тобто Edit не заповнений)
Тоді і вибиває помилку "is not a valid integer value" (що невірний тип даних)

16

Re: Занесення даних в базу даних (Delphi)

Властивості таблиці в базі даних також не завадять, бо якщо там "NOT NULL", то стерти поле не вийде. Якщо усе ОК, то стирання треба робити так:

ModulA_DMd.Main_ADOTb.FieldByName('Рік').Clear;
Подякували: Romanvolja1

17

Re: Занесення даних в базу даних (Delphi)

Torbins написав:

Ви привели не увесь код. ...

Так я тільки привів частину коду де потрібно було вирішити проблему.

Torbins написав:
ModulA_DMd.Main_ADOTb.FieldByName('Рік').Clear;

А це саме те що мені потрібно. Щиро дякую вам.

if Yhre_Ed.Text<>'' then
    begin
      with ModulA_DMd.Main_ADOTb do
        begin
          FieldByName('Рік').AsInteger:=StrToInt(Yhre_Ed.Text);
        end;
    end
else
    begin
          ModulA_DMd.Main_ADOTb.FieldByName('Рік').Clear;        
    end;

Тепер все працює як потрібно.

18

Re: Занесення даних в базу даних (Delphi)

Доброго дня в мене виникла ще одна проблема. Не-вдається занести в б/д Access зображення із компонента Image
Поле "Poster" б/д має тип "Поле об'єкту OLE"

Заношу так:

...
  if Setting_Fr.PartPsB_ChBx.Checked=True then
    begin
      with ModulA_DMd.Poster_ADOTb do
        begin
          FieldByName('Poster').Assign(Poster_Im.Picture);
          Post;
        end;
    end;
...

Компілюється нормально та при роботі додатку, коли заношу зображення в б/д випливає помилка
"Poster_ADOTb: Dataset not in edit or insert mode"
Буду щиро вдячний за допомогу.

19

Re: Занесення даних в базу даних (Delphi)

Тиць

Тут мала би бути якась влучна фраза(вибачте, що витратив кілька секунд вашого часу на прочитання).
Подякували: Torbins, varkon2