Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/56: Рейтинг темы: голосов - 56, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 23.03.2014
Сообщений: 18
1

Ошибка при добавлении записи в таблицу БД "Could not convert variant of type "NULL" into type "OleStr"

23.06.2014, 23:21. Показов 11754. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.

При работе программы вылетает ошибка "Could not convert variant of type "NULL" into type "OleStr" ", когда пользователь нажимает кнопку, в которой содержится только строка:
Delphi
1
DataModule1.ADOQuery1.Append;
По идее кнопка должна добавлять в таблицу базы данных строку, которая потом будет заполнятся данными из компонентов типа Edit и Memo.
Понимаю, что сведений для решения проблемы мало, подскажите, пожалуйста, хоть что-нибудь.

Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.06.2014, 23:21
Ответы с готовыми решениями:

Ошибка: "Could not convert variant of type (Null) into type (OleStr)"
Здравствуйте, помогите с такой ошибкой: при выборе ячейки в DBGrid вылетает ошибка как во вложении....

Ошибка: "Could not convert variant of type (Null) into type (OleStr)"
Проблема поиска выдаёт ошибку "Could not convert variant of type (Null) into type (OleStr)" ...

Ошибка "Could convert variant of type (Null) into type (oleStr)"
Пишу программу для курсовой работы, программка на тему АРМ Администратора анти-кафе, выскакивает...

Ошибка Unable to load project. Could not convert variant of type (Null) into type (OleStr)
вдруг не с того не с чего при запуске проекта вылетает ошибка Unable to load project. Could not...

Ошибка: Could not convert variant of type (null) into type (olestr)
здравствуйте подскажите пожалуйста использую для ввода в базу sql cxgrid (по идеи у меня cxgrid...

17
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
24.06.2014, 00:16 2
Цитата Сообщение от mrBatch Посмотреть сообщение
По идее кнопка должна добавлять в таблицу базы данных строку, которая потом будет заполнятся данными
А почему тогда используешь ADOQuery, а не ADOTable?
0
0 / 0 / 0
Регистрация: 23.03.2014
Сообщений: 18
24.06.2014, 23:49  [ТС] 3
Использую ADOQuery, потому что работаю с запросами. В программе вообще нет компонентов ADOTable.
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
25.06.2014, 02:30 4
Цитата Сообщение от mrBatch Посмотреть сообщение
Использую ADOQuery, потому что работаю с запросами.
А сам понимаешь что делаешь? Или используешь" натыренный" код без всякого понимания?
0
0 / 0 / 0
Регистрация: 23.03.2014
Сообщений: 18
25.06.2014, 02:43  [ТС] 5
Возможно, я что-то не понимаю. Иначе бы не писал на форум. Если можно ближе теме. Как правильно использовать ADOQuery для добавления строки в таблицу? Что конкретно приводит к ошибке? Спасибо.
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
25.06.2014, 02:52 6
Цитата Сообщение от mrBatch Посмотреть сообщение
Как правильно использовать ADOQuery для добавления строки в таблицу?
Если хочется "добавлять в таблицу базы данных строку, которая потом будет заполнятся", то это будет очень сложное извращение.
Цитата Сообщение от mrBatch Посмотреть сообщение
Возможно, я что-то не понимаю
Возможно. Представь свою задачу максимально полно.
P.S.
Задачу, а не проблему!
0
0 / 0 / 0
Регистрация: 23.03.2014
Сообщений: 18
25.06.2014, 03:06  [ТС] 7
Во-первых, объясни, пожалуйста, почему не стоит использовать ADOQuery в моих целях?
Во-вторых, сложность в том, что я не знаю в чем заключается проблема, я планировал, что мне на форуме подскажут, что-то от чего я смогу оттолкнуться и более точно сформулировать задачу, но... пока не получается.
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
25.06.2014, 03:32 8
Цитата Сообщение от mrBatch Посмотреть сообщение
Во-первых, объясни, пожалуйста, почему не стоит использовать ADOQuery в моих целях?
Ну как бы это не требует объяснения. Квери - это всегда некая выборка из набора данных по некоторому/некоторым критериям.
Цитата Сообщение от mrBatch Посмотреть сообщение
Во-вторых, сложность в том, что я не знаю в чем заключается проблема, я планировал, что мне на форуме подскажут, что-то
Так покажи код и объясни задачу. Неужели это сложно?
0
0 / 0 / 0
Регистрация: 23.03.2014
Сообщений: 18
25.06.2014, 04:03  [ТС] 9
Нет, не сложно. Пожалуйста. Мне показалось, что скидывать такой больший кусок кода не лучшая идея.
Delphi
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
procedure QueryRestart;
begin
  DataModule1.ADOQuery1.Close;
  DataModule1.ADOQuery1.Open;
  DataModule1.ADOQuery2.Close;
  DataModule1.ADOQuery2.Open;
  DataModule1.ADOQuery3.Close;
  DataModule1.ADOQuery3.Open;
  DataModule1.ADOQuery4.Close;
  DataModule1.ADOQuery4.Open;
  DataModule1.ADOQuery5.Close;
  DataModule1.ADOQuery5.Open;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  DataModule1.ADOQuery1.Append;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  DataModule1.ADOQuery1.Edit;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  if temp = 0 then
    DataModule1.ADOQuery1.Delete
  else if temp = 1 then
    DataModule1.ADOQuery2.Delete
  else if temp = 2 then
    DataModule1.ADOQuery3.Delete
  else if temp = 3 then
    DataModule1.ADOQuery4.Delete
  else if temp = 4 then
    DataModule1.ADOQuery5.Delete;
  QueryRestart;
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
  DataModule1.ADOQuery1.FieldByName('Name').AsString := Form1.Frame41.Edit1.Text;
  DataModule1.ADOQuery1.FieldByName('Category').AsInteger := Form1.Frame41.RadioGroup1.ItemIndex;
  DataModule1.ADOQuery1.FieldByName('Breafing').AsString := Form1.Frame41.Memo1.Lines.Text;
  DataModule1.ADOQuery1.FieldByName('Final').AsString := Form1.Frame41.Memo2.Lines.Text;
  DataModule1.ADOQuery1.FieldByName('End').AsDateTime := Form1.Frame41.DateTimePicker1.Date;
  DataModule1.ADOQuery1.Post;
  QueryRestart;
end;
 
procedure TForm1.Button5Click(Sender: TObject);
begin
  DataModule1.ADOConnection1.Cancel;
end;
 
procedure TForm1.DBGrid1Enter(Sender: TObject);
begin
  DataModule1.ADOQuery1.Cancel;
  temp := 1;
  if DataModule1.ADOQuery2.FieldByName('Name').IsNull then
     ClearFields
  else
  begin
    Form1.Frame41.Edit1.Text := DataModule1.ADOQuery2['Name'];
    Form1.Frame41.RadioGroup1.ItemIndex := DataModule1.ADOQuery2.FieldByName('Category').AsInteger;
    Form1.Frame41.Memo1.Lines.Text := DataModule1.ADOQuery2['Breafing'];
    Form1.Frame41.Memo2.Lines.Text := DataModule1.ADOQuery2['Final'];
    Form1.Frame41.DateTimePicker1.Date := DataModule1.ADOQuery2.FieldByName('End').AsDateTime;
  end;
end;
 
procedure TForm1.DBGrid2Enter(Sender: TObject);
begin
  DataModule1.ADOQuery1.Cancel;
  temp := 2;
  if DataModule1.ADOQuery3.FieldByName('Name').IsNull then
    ClearFields
  else
  begin
    Form1.Frame41.Edit1.Text := DataModule1.ADOQuery3['Name'];
    Form1.Frame41.RadioGroup1.ItemIndex := DataModule1.ADOQuery3.FieldByName('Category').AsInteger;
    Form1.Frame41.Memo1.Lines.Text := DataModule1.ADOQuery3['Breafing'];
    Form1.Frame41.Memo2.Lines.Text := DataModule1.ADOQuery3['Final'];
    Form1.Frame41.DateTimePicker1.Date := DataModule1.ADOQuery3.FieldByName('End').AsDateTime;
  end;
end;
 
procedure TForm1.DBGrid3Enter(Sender: TObject);
begin
  DataModule1.ADOQuery1.Cancel;
  temp := 3;
  if DataModule1.ADOQuery4.FieldByName('Name').IsNull then
    ClearFields
  else
  begin
    Form1.Frame41.Edit1.Text := DataModule1.ADOQuery4['Name'];
    Form1.Frame41.RadioGroup1.ItemIndex := DataModule1.ADOQuery4.FieldByName('Category').AsInteger;
    Form1.Frame41.Memo1.Lines.Text := DataModule1.ADOQuery4['Breafing'];
    Form1.Frame41.Memo2.Lines.Text := DataModule1.ADOQuery4['Final'];
    Form1.Frame41.DateTimePicker1.Date := DataModule1.ADOQuery4.FieldByName('End').AsDateTime;
  end;
end;
 
procedure TForm1.DBGrid4Enter(Sender: TObject);
begin
  temp := 4;
  if DataModule1.ADOQuery5.FieldByName('Name').IsNull then
    ClearFields
  else
  begin
    Form1.Frame41.Edit1.Text := DataModule1.ADOQuery5['Name'];
    Form1.Frame41.RadioGroup1.ItemIndex := DataModule1.ADOQuery5.FieldByName('Category').AsInteger;
    Form1.Frame41.Memo1.Lines.Text := DataModule1.ADOQuery5['Breafing'];
    Form1.Frame41.Memo2.Lines.Text := DataModule1.ADOQuery5['Final'];
    Form1.Frame41.DateTimePicker1.Date := DataModule1.ADOQuery5.FieldByName('End').AsDateTime;
  end;
end;
 
procedure TForm1.DBGridListEnter(Sender: TObject);
begin
  DataModule1.ADOQuery1.Cancel;
  temp := 0;
  if DataModule1.ADOQuery1.FieldByName('Name').IsNull then
    ClearFields
  else
  begin
    Form1.Frame41.Edit1.Text := DataModule1.ADOQuery1['Name'];
    Form1.Frame41.RadioGroup1.ItemIndex := DataModule1.ADOQuery1.FieldByName('Category').AsInteger;
    Form1.Frame41.Memo1.Lines.Text := DataModule1.ADOQuery1['Breafing'];
    Form1.Frame41.Memo2.Lines.Text := DataModule1.ADOQuery1['Final'];
    Form1.Frame41.DateTimePicker1.Date := DataModule1.ADOQuery1.FieldByName('End').AsDateTime;
  end;
end;
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
25.06.2014, 07:35 10
Цитата Сообщение от mrBatch Посмотреть сообщение
Во-вторых, сложность в том, что я не знаю в чем заключается проблема
Проблема в том, что SQL запрос на выборку обычно возвращает набор, не предназначенный для редактирования.
Почему так - написано в "Фаронов В.В., Шумаков П.В. Delphi 5. Руководство разработчика баз данных"

Если в этом коде заменить ADOQuery на ADOTable, с высокой степенью вероятности он заработает.
1
0 / 0 / 0
Регистрация: 23.03.2014
Сообщений: 18
25.06.2014, 20:54  [ТС] 11
Т.е. мне еще нужно добавить в программу компонент ADOTable? И использовать ADOQuery, когда нужно получить из таблицы набор данных, а ADOTable, когда нужно внести данные в таблицу?
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
26.06.2014, 03:47 12
Цитата Сообщение от mrBatch Посмотреть сообщение
Т.е. мне еще нужно добавить в программу компонент ADOTable? И использовать ADOQuery, когда нужно получить из таблицы набор данных, а ADOTable, когда нужно внести данные в таблицу?
Если это данные одной таблицы из локальной базы - то проще все делать через ADOTable, и отображение и редактирование.
0
3586 / 2195 / 693
Регистрация: 29.05.2013
Сообщений: 9,374
26.06.2014, 08:21 13
Не в том дело, что вам еще надо добавить AdoTable, а в том, что вы работаете с AdoQuery как с AdoTable - вы используете методы и свойства от класса TADOTable.
Судя по вашему куску кода, по идее если вы просто в описании у себя замените:
AdoQuery1: TAdoQuery;
на
AdoQuery1: TAdoTable;
то вообще ничего менять больше не потребуется.

А что касается работы с AdoQuery, то ваш оппонент во несколько неправ. В большинстве случаев работа с AdoQuery проще, быстрее, а частенько и просто иной альтернативы и не предусматривает. Но работать с этим классом надо конечно изначально правильно.
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
26.06.2014, 08:35 14
Цитата Сообщение от Пытливый Посмотреть сообщение
В большинстве случаев работа с AdoQuery проще, быстрее, а частенько и просто иной альтернативы и не предусматривает.
И предполагает несколько иной подход к работе с базой, что требует несколько другого уровня представления о SQL. Почему и предлагается для запросов по одной таблице локальной базы заменить Query на Table и почитать книгу, в которой описана разница .
0
669 / 559 / 242
Регистрация: 26.11.2012
Сообщений: 2,191
26.06.2014, 11:19 15
Вот этот код мне не ясен
Цитата Сообщение от mrBatch Посмотреть сообщение
Delphi
1
2
3
4
5
6
7
begin
   Form1.Frame41.Edit1.Text := DataModule1.ADOQuery2['Name'];
   Form1.Frame41.RadioGroup1.ItemIndex := DataModule1.ADOQuery2.FieldByName('Category').AsInteger;
   Form1.Frame41.Memo1.Lines.Text := DataModule1.ADOQuery2['Breafing'];
   Form1.Frame41.Memo2.Lines.Text := DataModule1.ADOQuery2['Final'];
   Form1.Frame41.DateTimePicker1.Date := DataModule1.ADOQuery2.FieldByName('End').AsDateTime;
  end;
Если хотите получить данные из записи
Delphi
1
2
3
Form1.Frame41.Edit1.Text :=DataModule1.ADOQuery2.DataSource.DataSet.FieldByName('Name').Value;
//или
Form1.Frame41.Edit1.Text :=DataModule1.ADOQuery2.DataSource.DataSet.FieldByName('Name').asString;
Для работы через ADOQuery используются SQL запросы Select для выборки данных
INSERT, UPDATE, DELETE изменение.

Если использовать как пытаетесь вы то лучше делать так

Delphi
1
2
3
DataModule1.ADOQuery2.Append; 
DataModule1.ADOQuery2.DataSource.DataSet.FieldByName('Name').Value:='Привет';
DataModule1.ADOQuery2.Post;
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
26.06.2014, 13:37 16
Цитата Сообщение от ZfoxAK Посмотреть сообщение
Если использовать как пытаетесь вы то лучше делать так
Есть уверенность, что это сработает? Про backend и схему ни слова не было. Ну и просто ИМХО - плохому учите.
0
669 / 559 / 242
Регистрация: 26.11.2012
Сообщений: 2,191
27.06.2014, 05:42 17
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Есть уверенность, что это сработает?
uglyPinokkio, вы правы не будет. ..... малость напутал
а вот так будет)
Delphi
1
BDGrid.DataSource.DataSet.FieldByName('Name').Value:='Привет';
или
Delphi
1
DataModule1.ADOQuery2.FieldByName('FIO').Value:='Привет';
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Про backend и схему ни слова не было. Ну и просто ИМХО - плохому учите.
ИМХО Вроде форум, а не университет что бы учить.
0
0 / 0 / 0
Регистрация: 23.03.2014
Сообщений: 18
27.06.2014, 20:20  [ТС] 18
Вроде решилось. Проблема состояла в том, что в таблице были пустые ячейки.

Спасибо, вам за помощь.
0
27.06.2014, 20:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.06.2014, 20:20
Помогаю со студенческими работами здесь

Не открывается проект, пишет 'Could not convert variant of type (Null) into type (OleStr)
Крч такое дело было, я добавил в главный юнит функцию отслеживания активности форма, но не мог...

XML Получение данных. Ошибка Could not convert variant of type (Null) into type (OleStr)
Здравствуйте! Пытаюсь загрузить из xml в мемо данные, но выдает ошибку, хотя данные в мемо...

Unable to load project [путь проекта] could not convert variant of type (null) into type (olestr)
Добрый день! при перезагрузке проекта столкнулся проблемой: проект не хочет открываться и выдает...

При конвертации даты возникает ошибка could not convert variant of type(Null) into type (date)
Добрый день.Помогите пожалуйста. При конвертации даты возникает ошибка could not convert variant...

StrToFloat. Could not convert variant of type (OleStr) into type (Double)
Привет, возникла проблема и решить не удается ни поиском, не методом тыка. Есть dll в которой...

Ошибка: Could not convert variant of type (Null) into type (String) - Фильтрация
В polycom200U1GTADOQuery1 свойстве Events - OnFilterRecord пишу procedure...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru