- Справочник
- ODBC
Работа с базами данных через ODBC
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/
(Разрядность ПО для ODBC-соединения должна совпадать с разрядностью iRidium server.)
- Найдите в Windows и запустите приложение ODBC Data Sources (32-bit или 64-bit).

- Добавьте новое соединение с базой данных и настройте его.
-865dcbd389b551826b970881e3c0a06d.png)
В целях безопасности поля User и Password не рекомендуется задавать в приложении ODBC Data Sources, так как они там не зашифрованы. Эти данные передаст iRidium server при подключении к базе данных.
- Напишите скрипт, в котором будет создаваться объект ODBC и производиться запрос к базе данных с использованием метода .Query().
Для того, чтобы на сервере корректно активировалась лицензия, необходимо подключаться к ODBC в скриптах не по событию EVENT_START, а с небольшой задержкой, например, с использованием функции IR.SetTimeout() или от нажатия кнопки.
Проверка подключения к базе данных
При создании объекта ODBC, скрипт не имеет возможности идентифицировать подключение к базе данных и делает запрос даже если подключение не установлено. В таком случае необходимо предварительно проверить подключение к базе данных. Например, нам нужно подключиться к базе данных, созданной в MySQL. Для этого необходимо создать проект и в нем создать скрипт.
IR.AddListener(IR.EVENT_START,0,function()
{
var BaseMySQL = new ODBC("root", "123", "MySQLresurs");
if(BaseMySQL == false)
{
IR.Log("Wrong connection");
}
else
{
IR.Log("Right connection");
}
});
Запускаем проект:
- если MySQL подключится, то выведет в лог данные;
- если MySQL не подключился, то в логе появится значение false. Аналогичную проверку необходимо проводить и с серверным проектом.
Пример. Запись в базу данных
Данный скрипт получает данные о потреблении электроэнергии и температуре в двух точках со счётчика энергии и датчиков температуры по протоколу 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-соединение false, если подключение не удалось (несуществующее соединение или неверный пароль) |
Пример
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");`
.ParameterizedQuery()
Делает запрос к базе данных и возвращает ответ в виде выборки RecordSet. (Метод поддерживает кириллические символы)
Выборки SQL-запросов могут иметь большие объёмы. При работе с большими выборками разработчик должен учитывать ограничения в виде размера оперативной памяти, быстродействия процессора, коммуникационных контроллеров, пропускной способности сетевых интерфейсов своей системы. Рекомендуется программно ограничивать размер выборок.
Синтаксис
ODBCobj.ParameterizedQuery(String, Array);
| на входе | значение | описание |
|---|---|---|
| ODBCobj | [object DevicePrototype] | type: object Объект подключения к ODBC |
| String | "" | type: string где name - любое уникальное имя, char[200] - тип данных для данного столбца |
| Array | [ ] | type: type массив данных для передачи в базу: array |
| на выходе | ||
|---|---|---|
| RecordSetObj | [ ] | type: object Объект выборки RecordSet. Если запрос ответа не предполагает, то будет возвращено значение false. |
Пример
var response = var SQLite = false;
IR.AddListener(IR.EVENT_START,0,function() {
IR.SetInterval(1000, getData);
});
function getData() {
if (!SQLite) { //if no ODBC object
SQLite = new ODBC("root", "", "Test"); // creating ODBC object
if (SQLite)
{
IR.Log(SQLite + " connected!");
};
};
};
function Intu () {
var query = "INSERT INTO TestODBC(Intu) VALUES(:name<int>);"
var arr = [654];
var response = SQLite.ParameterizedQuery(query, arr); // SQL query to SQLite database
};
Исходные данные: у вас есть база данных под названием TestODBC в ней есть строка с названием Intu, с типом данных int.