Материал из for iRidium developers
Перейти к: навигация, поиск
Эта страница является переводом страницы ODBC. Перевод выполнен на 100%.

Other languages:

iRidium server предоставляет функционал, управляемый через скрипт и позволяющий через ODBC (Open Database Connectivity) получить локальный или удалённый доступ к различным базам данных, таким как: MySQL, PostgreSQL, SQLite, Oracle, SQL Server, Microsoft Access, dBase, Paradox, FoxPro и т.д.

ODBC - платный функционал в iRidium server. Доступен в iRidium pro 1.2.10 и выше.

ODBC-драйвер работает только в iRidium server, работающим под управлением ОС Windows (x86/x64). Функционал для ODBC и поддержка некоторых СУБД (SQL Server, Microsoft Access, dBase, Paradox, FoxPro) по умолчанию включены в стандартный пакет установки ОС Windows.

Для работы с другими базами данных необходимо скачать ПО для ODBC-соединения с ОС Windows от производителя соответствующей СУБД. Например, для работы с MySQL необходимо скачать приложение Connector/ODBC для Windows: https://dev.mysql.com/downloads/connector/odbc/


1 Найдите в Windows и запустите приложение ODBC Data Sources (32-bit или 64-bit).

ODBC administrator.png

2 Добавьте новое соединение с базой данных и настройте его.

ODBC config.png

3 Напишите скрипт, в котором будет создаваться объект ODBC и производиться запрос к базе данных с использованием метода .Query().

Для того, чтобы на сервере корректно активировалась лицензия, необходимо подключаться к ODBC в скриптах не по событию EVENT_START, а с небольшой задержкой, например, с использованием функции IR.SetTimeout() или от нажатия кнопки.


Пример. Запись в базу данных

Данный скрипт получает данные о потреблении электроэнергии и температуре в двух точках со счётчика энергии и датчиков температуры по протоколу Modbus TCP и записывает измеренные значения в локальную базу данных SQLite через механизм ODBC.

Таким же образом могут записаны данные в любую локальную или удалённую базу данных SQL.

var SQLite = false;
var query_head = "INSERT INTO measure(datetime, consumption, temperature1, temperature2) VALUES(";
var cdt = 0;
var cons = 0;
var temp1 = 0;
var temp2 = 0;
 
IR.AddListener(IR.EVENT_START,0,function()
{
   IR.SetInterval(1000, getData);
});
 
function getData()
{
   if (!SQLite)  //if no ODBC object
   {
      SQLite = new ODBC("", "", "sqlite3"); // creating ODBC object
      if (SQLite)
      {
         IR.Log(SQLite + " connected!");
      }
   }
   else
   {    
      var currentdatetime = new iDate();             
      cdt = currentdatetime.value;
      // current date and time in OLE Automation date format (OADate)
      cons = IR.GetDevice("Modbus TCP").GetFeedback("Channel 1");
      temp1 = IR.GetDevice("Modbus TCP").GetFeedback("Channel 2");
      temp2 = IR.GetDevice("Modbus TCP").GetFeedback("Channel 3");
      var query = query_head + cdt + "," + cons + "," + temp1 + "," + temp2 + ");";
                         /*(datetime, consumption, temperature1, temperature2)*/      
      var response = SQLite.Query(query); // SQL query to SQLite database
      IR.Log(query);   
   }
}

Пример. Чтение из базы данных

В этом примере производится запрос к базе данных MySQL, полученный ответ распаковывается в массив, затем отображается первый элемент поля "User".

При запросах чтения из базы данных SQL необходимо учитывать ограничения размера памяти и производительности процессора.

IR.AddListener(IR.EVENT_START,0,function()
{
    IR.SetTimeout(50, getData);
    // waiting 50 milliseconds for appropriate iRidium ODBC driver license activation
});
function getData()
{
   var MySQL = new ODBC("root", "", "MySQLresurs"); // creating database connection object
   var response = MySQL.Query("SELECT * FROM users"); // SQL query to MySQL database
   if (response)          // if connection is successful and answer exists
   {
       var rows = response.GetRows();
       var columns = response.GetColumns();
       var data = {};               // two-dimension array with query result
       for (var i = 0; i < columns; i++) {
           var colName = response.GetColumnName(i);
           data[colName] = [];
           for (var j = 0; j < rows; j++) {
               data[colName][j] = response.GetRowValue(i, j);
           }
       }
    response.Free(); // free memory of recordset (optional action for memory optimization)
    IR.Log(data["User"][0]);   // first user in MySQL table
    }
}


Объект ODBC


new ODBC()

Создаёт объект ODBC, который соединяется с базой данных и содержит единственный метод Query().

Синтаксис

new ODBC(login, password, dsn);

на входе значение описание
login 'myname' type: string
Логин (имя пользователя) для подключения к базе данных
password 'qwerty' type: string
Пароль для подключения базе данных (может быть пустой для локальной базы данных)
dsn 'MySQLresurs' type: string
Имя источника данных ODBC (DSN)
на выходе
object [object DevicePrototype] type: object
ODBC-соединение


Пример

var MySQL = new ODBC("root", "", "MySQLresurs");
IR.Log(MySQL); // [object DevicePrototype]

чтобы обратиться к объекту, запишите его в переменную


Методы объекта ODBC


.Query()

Делает запрос к базе данных и возвращает ответ в виде выборки RecordSet.

Выборки SQL-запросов могут иметь большие объёмы. При работе с большими выборками разработчик должен учитывать ограничения в виде размера оперативной памяти, быстродействия процессора, коммуникационных контроллеров, пропускной способности сетевых интерфейсов своей системы. Рекомендуется программно ограничивать размер выборок.

Синтаксис

ODBCobj.Query(query);

на входе значение описание
ODBCobj [object DevicePrototype] type: object
Объект подключения к ODBC
query 'SELECT * FROM orders' type: string
Строка запроса
на выходе
RecordSetObj [ ] type: object
Объект выборки RecordSet. Если запрос ответа не предполагает, то будет возвращено значение false.


Пример

var response = DB.Query("SELECT * FROM users");