0
Answered

Работа с БД

evg 7 years ago updated by Vladimir Ovchinnikov (expert) 7 years ago 7

Добрый день!

Бьюсь с пользовательской БД. При попытке запуска, сервер ругается вот так.

Запускаю сервер на Windows

Image 26311


Вроде все по инструкции. При попытке запуска проекта-примера из вики - та же история.

Т.е. даже не могу создать БД.

Проект прикладываю. Помогите разобраться. Возможно что-то в синтаксисе. Или на компе нет средств для работы с БД?

SQL_DB_Windows.sirpz

Answered

Добрый день.

var mybase = new SQL();


IR.AddListener(IR.EVENT_START,0,function()
{
mybase.Open('KNX.db');    //открыть БД, если ее нет, то создать     
mybase.Execute("BEGIN");         //начать работу с БД     
mybase.Execute('CREATE TABLE KNX_Data(ID int, Datetime int, Value TEXT)'); //создать таблицу KNX_Data с полями  
IR.Log("Тут создалась БД");  
mybase.Execute("COMMIT");        //закончить работу с БД
mybase.Close();   
});


База будет тут: C:\Users\%username%\Documents\iRidium pro documents\Server\Documents\<ProjectName>\KNX.db

Возможно перед загрузкой проекта на сервер понадобится очистить каталог C:\Users\%username%\Documents\iRidium pro documents\Server\

Чистка каталога сервера помогла. База с нужными таблицами создалась. Но теперь проблема в том, что я не могу записать значение в таблицу. Лог сервера ниже

Таблицы есть, но они пустые.

Дайте код, которым в БД пишете.

IR.SetGlobalListener(IR.EVENT_GLOBAL_TAG_CHANGE, function(name, value)
{   
   var name_1 = name.split('.');
   IR.Log("Change: " + name + " = " + value);
          
   mybase.Open('KNX.db', true);     
   mybase.Execute("BEGIN");  
   mybase.Execute('INSERT INTO KNX_Data3(Name, Value) VALUES("' + name_1[3] + '",' + value + ')');  
   mybase.Execute("COMMIT");  
   mybase.Close();
  
});

//  Блок подписи на необходимые теги
IR.SubscribeTagChange("Server.Tags.KNX-1.пом_2 - темп тек");

Answered

var mybase = new SQL();

IR.AddListener(IR.EVENT_START,0,function()
{
    mybase.Open('KNX.db');    //открыть БД, если ее нет, то создать     
   mybase.Execute("BEGIN");         //начать работу с БД
   mybase.Execute('CREATE TABLE KNX_Data(Name TEXT, Value TEXT)');    
   IR.Log("Тут создалась БД");  
   mybase.Execute("COMMIT");        //закончить работу с БД
   mybase.Close();   
});

IR.SetGlobalListener(IR.EVENT_GLOBAL_TAG_CHANGE, function(name, value)
{   
   var name_1 = name.split('.');
   var s_name = '"'+name_1[3]+'"'; //строку нужно отдать запросу в кавычках
   IR.Log("Change: " + name + " = " + value);      
   mybase.Open('KNX.db');     
   mybase.Execute('BEGIN');
   mybase.Execute('INSERT INTO KNX_Data(Name, Value) VALUES('+s_name+','+value+')');
   mybase.Execute('COMMIT');  
   mybase.Close();
 
});

//  Блок подписи на необходимые теги
IR.SubscribeTagChange("Server.Tags.KNX-1.пом_2 - темп тек");

Разве это:

var s_name = '"'+name_1[3]+'"';

mybase.Execute('INSERT INTO KNX_Data(Name, Value) VALUES('+s_name+','+value+')');


не то же самое, что это:

mybase.Execute('INSERT INTO KNX_Data3(Name, Value) VALUES("' + name_1[3] + '",' + value + ')');

Не то же самое. Здесь в Execute() нужно передать строку запроса. Формировать её нужно не внутри метода, а до его использования.