Ошибка could not convert variant of type

Do you know why the block of code bellow will negate the «Could not convert variant of type (Null) into type (OleStr)» on some computers, not all of them but 3 out of ten computers generate the error message.

enter image description here

function GetWMIstringSW(const WMIClass, WMIProperty:string): string;

const
  wbemFlagForwardOnly = $00000020;

var
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
  LNode         : TTreeNode;
  LNode2        : TTreeNode;

begin
  Result:='';
  FWbemObjectSet:= FWMIService.ExecQuery(Format('Select %s from %s',[WMIProperty, WMIClass]),'WQL',wbemFlagForwardOnly);
  oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;

  while oEnum.Next(1, FWbemObject, iValue) = 0 do
    begin
      if not VarIsNull(FWbemObject.Properties_.Item(WMIProperty).Value) then
      Result:=FWbemObject.Properties_.Item(WMIProperty).Value;
      LNode := ClientForm.TreeView1.Items.AddChild(Node, Format('%s',[String(FWbemObject.Name)]));

      LNode2 := ClientForm.TreeView1.Items.AddChild(LNode, Format('%s',[String(FWbemObject.Version)]));
      FWbemObject:=Unassigned;
    end;

end;

The function is then executed at FormCreate:

GETWMIstringSW('Win32_Product','Name');

Thank you so much for your help.

mrBatch

0 / 0 / 0

Регистрация: 23.03.2014

Сообщений: 18

1

23.06.2014, 23:21. Показов 10737. Ответов 17

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Здравствуйте.

При работе программы вылетает ошибка «Could not convert variant of type «NULL» into type «OleStr» «, когда пользователь нажимает кнопку, в которой содержится только строка:

Delphi
1
DataModule1.ADOQuery1.Append;

По идее кнопка должна добавлять в таблицу базы данных строку, которая потом будет заполнятся данными из компонентов типа Edit и Memo.
Понимаю, что сведений для решения проблемы мало, подскажите, пожалуйста, хоть что-нибудь.

Спасибо.



0



пофигист широкого профиля

4662 / 3096 / 855

Регистрация: 15.07.2013

Сообщений: 17,857

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



пофигист широкого профиля

4662 / 3096 / 855

Регистрация: 15.07.2013

Сообщений: 17,857

25.06.2014, 02:30

4

Цитата
Сообщение от mrBatch
Посмотреть сообщение

Использую ADOQuery, потому что работаю с запросами.

А сам понимаешь что делаешь? Или используешь» натыренный» код без всякого понимания?



0



0 / 0 / 0

Регистрация: 23.03.2014

Сообщений: 18

25.06.2014, 02:43

 [ТС]

5

Возможно, я что-то не понимаю. Иначе бы не писал на форум. Если можно ближе теме. Как правильно использовать ADOQuery для добавления строки в таблицу? Что конкретно приводит к ошибке? Спасибо.



0



пофигист широкого профиля

4662 / 3096 / 855

Регистрация: 15.07.2013

Сообщений: 17,857

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



пофигист широкого профиля

4662 / 3096 / 855

Регистрация: 15.07.2013

Сообщений: 17,857

25.06.2014, 03:32

8

Цитата
Сообщение от mrBatch
Посмотреть сообщение

Во-первых, объясни, пожалуйста, почему не стоит использовать ADOQuery в моих целях?

Ну как бы это не требует объяснения. Квери — это всегда некая выборка из набора данных по некоторому/некоторым критериям.

Цитата
Сообщение от mrBatch
Посмотреть сообщение

Во-вторых, сложность в том, что я не знаю в чем заключается проблема, я планировал, что мне на форуме подскажут, что-то

Так покажи код и объясни задачу. Неужели это сложно?



0



mrBatch

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



3452 / 2091 / 666

Регистрация: 29.05.2013

Сообщений: 8,955

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



ZfoxAK

668 / 558 / 242

Регистрация: 26.11.2012

Сообщений: 2,190

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



ZfoxAK

668 / 558 / 242

Регистрация: 26.11.2012

Сообщений: 2,190

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



Программа Retail Declaration более не поддерживается.

Для работы с ЕГАИС рекомендуем использовать Контур.Маркет.

Если при попытке распроведения документа в программе возникает ошибка Could not convert variant of type (Null) into type (Integer)

то возможны 2 причины

  1. Не настроен УТМ для подразделения декларанта, к которому привязан документ.
  2. В программе удален декларант, к которому привязан документ.

Для решения проблемы выполните следующие шаги:

  1. Проверьте, настроен ли УТМ для подразделения декларанта, к которому привязан документ, по инструкции
  2. Если УТМ настроен и ошибка сохраняется, то составьте обращение в техподдержку, приложив скриншот ошибки, описание действий, которые приводят к данной ошибке, базу данных программы обязательно в архиве, не бэкап (Инструкция по выгрузке базы Retail Declaration).

Вы определились с выбором?

Перейти к оформлению заказа

StarUML

  • Summary

  • Files

  • Reviews

  • Support

  • Code

  • Cvs

  • Tickets ▾

    • Feature Requests
    • Bugs
  • News

  • Discussion

Menu

"Could not convert variant of type (OleStr) i


Created:

2009-02-26

Updated:

2019-06-05

  • Marc60

    Hi everybody,

    I get the following error message opening an UML project done by project partners using StartUML 5.0.2.1570:

    «Could not convert variant of type (OleStr) into type (Double)».

    I use the same StarUML version, and I can open open the sample projects without problems.

    Thank you very much in advance for any hints!

    Best regards

    Marco

  • Alexander Kuchler

    I have exactly the same problem. Is there already any solution??

  • Schneider Julien

    Solution for french desktop in windows XP :
    Panneau de configuration => Options régionales => personnaliser :
    Dans le champ «symbole décimal» , remplacer «,» par «.»

    Solution is to change windows decimal symbol from «,» to «.» in control panel.

    Control panel -> local options -> personnalise — decimal symbol = «.»

    It works for me.

    Maybe a bug in StarUML ? THis soft whould force «.» decimal symbol use ?

  • Alexander Kuchler

    I found another solution in case you can’t or don’t want to change your
    windows configuration in that way. There is a script called LocalFix.bat (from
    http://www.cameel.freehost.pl/download.php) which is changing your settings temporary only for the program
    start and reverting it again afterwards.

    In my case I had to modify the script and change ‘.’ and ‘,’ because for me it
    was exactly the other way around.

  • Meyburgh Hofmeyr

    Also found good solution that worked for me (same as Scneider — it is region error/setting):

    Sometimes applications may cause this error:
    Could not convert variant of type (Olestr) into type (Double)

    For example, the first time i saw this error was when i tried to load StarUML project. Reason is that decimal separators in application not match with decimal separators defined in system. To solve it, open Control Panel / Regional and Language Options / Regional Options / Customize and change value of «Decimal separator key». For example, if it was a comma, set it to point. (Tasmanian Fox)

     

    Last edit: Meyburgh Hofmeyr 2019-06-05


Log in to post a comment.

Error Description:

The error you are receiving is due to a corrupted Collections database file for EasyWorship.

Resolution:

Here are the steps to resolve this:

  1. Open EasyWorship, click on Profiles, and then Profiles Manager.
  2. In the middle of the window, where it says Instance Location, click on the name of your profile highlighted in blue. (This will open a File Explorer window of your EasyWorship database folders.)
  3. Move the File Explorer window over to the side, and close out of the Profile Editor window, and then close out of EasyWorship.
  4. In the File Explorer window that opened, open the v6.1 folder, then the Databases folder, and finally the Data folder.
  5. Right-click the Collections.db file and click Rename. 
  6. Rename it to Collections1.db.
  7. Close that File Explorer window and re-open EasyWorship.
  8. You will see a window pop up asking you to fix the data. Click the Fix Data button.

This should resolve your issue and you should now no longer receive that error message.

If this does not resolve your issue, please contact EasyWorship Support.

Create Support Ticket

Возможно, вам также будет интересно:

  • Ошибка could not connect to the database
  • Ошибка could not connect to server the forest
  • Ошибка could not connect to mysql server
  • Ошибка could not connect to default or fallback server
  • Ошибка could not complete the operation

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии