EnglishУкраїнськаmRussian
Login/New
Topic with no new replies

Забавные проебразования типов


Author Message
Written on: 22. 04. 2018 [10:45]
punk
Василий Петров
Topic creator
registered since: 09.05.2011
Posts: 57
Есть программа, которая кладёт массив в БД sqlite, а потом читает обратно. При этом значения <EVAL> обрезаются до 0.
JAVASCRIPT
//создаём массив с элементами <EVAL>
baseArrLen=3;
arr1=new Array();
for (ch1=0;ch1<baseArrLen;ch1++)
		arr1[ch1]=EVAL_INT;
arr1[1]=22;
sValWithoutSql=arr1;
//записываем его в базу
comprState=blowerState="z";
dbComs="pcsDataA";
SYS.messErr("test массив для записи","arr1="+arr1);
sr="insert or replace into "+dbComs+" values(\""+comprState+"\",\""+blowerState+"\",\""+arr1+"\")";
rez = SYS.BD.nodeAt("SQLite.prodConsStat",".").SQLReq(sr);
 
//читаем его обратно
rez = SYS.BD.nodeAt("SQLite.prodConsStat",".").SQLReq("SELECT pcValue FROM "+dbComs+" WHERE comprState=\""+comprState+"\" AND blowerState=\""+blowerState+"\";");
//curParams=rez[1];
SYS.messErr("test прочитано из SQL","rez[1]="+rez[1]);
sVal2=rez[1]["pcValue"];
sValBySql=sVal2;	//тут обрезается EVAL до 0 !!!!
SYS.messErr("test локальная переменная","sVal2="+sVal2);
SYS.messErr("test переменная \"выход\" без SQL","sValWithoutSql="+sValWithoutSql);
SYS.messErr("test переменная \"выход\" c SQL","sValBySql="+sValBySql);

Вывод:
22-04-2018 10:36:23 4[test массив для записи] arr1=<TArrayObj>
<int><EVAL></int>
<int>22</int>
<int><EVAL></int>
</TArrayObj>

22-04-2018 10:36:23 4[test прочитано из SQL] rez[1]=<TArrayObj>
<str><TArrayObj>
<int><EVAL></int>
<int>22</int>
<int><EVAL></int>
</TArrayObj>
</str>
<str p='pcValue'><TArrayObj>
<int><EVAL></int>
<int>22</int>
<int><EVAL></int>
</TArrayObj>
</str>
</TArrayObj>

22-04-2018 10:36:23 4[test локальная переменная] sVal2=<TArrayObj>
<int><EVAL></int>
<int>22</int>
<int><EVAL></int>
</TArrayObj>

22-04-2018 10:36:23 4[test переменная "выход" без SQL] sValWithoutSql=<TArrayObj>
<int><EVAL></int>
<int>22</int>
<int><EVAL></int>
</TArrayObj>

22-04-2018 10:36:23 4[test переменная "выход" c SQL] sValBySql=<TArrayObj>
<int>0</int>
<int>22</int>
<int>0</int>
</TArrayObj>

Переменные sValWithoutSql и sValBySql объявлены как "выход" (тип "объект"). Визуально 3 массива из 4х выглядят одинаково, однако первое преобразование (arr1-->sValWithoutSql) ничего не меняет, а второе(arr1-->SQL-->SQLResultArray-->sVal2-->sValBySql) обрезает EVAL до 0, причём на последнем шаге (sVal2-->sValBySql). С чем может быть связано?
Written on: 23. 04. 2018 [07:51]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3742
"punk" wrote:

...
С чем может быть связано?

С тем, что EVAL это внутреннее понятие OpenSCADA, которое к SQL не имеет никакого отношения.

Кроме того, сейчас EVAL в БД хранится как NULL, в результате SQL записывается как "<NULL>" и отсюда 0, если преобразовать в число.

P.S. Ищите по форуму про запись EVAL в NULL БД.

Learn, learn and learn better than work, work and work.



4695