Действия с базами данныхAutoPlay Media Studio имеет поддержку нескольких технологий баз данных включая MySQL, Oracle, и Sqlite3. Функциональные возможности этих баз данных сделаны при помощи библиотеки LuaSQL, разработанной и осуществленной командой Kepler Project. Каждая технология поддерживаемых баз данных имеет соответствующую категорию действий. По умолчанию эти действия скрыты в Мастере действий (Action Wizard), и будут показаны только после разрешения поддержки баз данных в проекте. Можно разрешить или запретить поддержку баз данных отдельно в диалоговом окне Базы данных (Databases), что доступны при выборе в меню Проект (Project) > Базы данных (Databases). Примечание: При включении поддержки баз данных в AutoPlay, соответствующий LuaSQL запрос оператора будет автоматически выполняться при запуске программы (autorun.exe). Например, если разрешается поддержка MySQL, не нужно добавлять к скрипту require "luasql.mysql", это будет сделано автоматически.
Обработка ошибок
Действия с базами данных поддерживают два возвращаемых значения. Первое возвращает значение характерное для каждого действия. Второе значение дополнительное и используется для приема ошибочной строки от драйвера базы данных, если таковая имеется.
Обычно первая возвращаемая переменная будет содержать значение, а вторая будет нулем. В случае ошибки, первое возвращаемое значение будет нулем, а второе возвращенное значение будет строкой, содержащей сообщение об ошибке, если оно имеется. (Если сообщения об ошибке нет, оба значения будут равны нулю.) Примечание: Использование второго возвращаемого значения необязательно - можно не указывать любую переменную для его получения, и оно будет просто проигнорировано.
Действия с базами данных
Все действия с базами данных имеют почти тот же синтаксис, что и различные технологии баз данных.
В следующей секции заменяйте часть "xxxx" каждого имени метода, названием каждой категории действия. Например:
Объекты среды
Объект среды представляет собой связь с драйвером базы данных и обычно возвращается из вызова функции инициализации.
Эта инициализация выполняется автоматически при запуске любой базы данных, задействованной в диалоговом окне Базы данных (Databases).
Объект среды любой базы данных также автоматически будет закрыт при выключении.
Таким образом, в AutoPlay не нужно выполнять вызов, такой как: env = luasql.mysql() MySQL = luasql.mysql(); В AutoPlay, объекты среды представлены следующими категориями действий:
Действия средыxxxx:connect(sourcename[,username[,password]])
Подключение к источнику данных указанного в sourcename используя username и password, если они заданы.
Sourcename (имя источника) может изменяться соответственно типа каждой базы данных.
Для MySQL и PostgreSQL, также можно предоставлять дополнительные hostname и port:
MySQL:connect(sourcename[,username[,password[,hostname[,port]]]])
PostgreSQL:connect(sourcename[,username[,password[,hostname[,port]]]]) Примечание: Для PostgreSQL, MySQL и SQLite sourcename (имя источника) это имя базы данных. Для ODBC это имя из DSN, а для драйвера Oracle это имя службы. Возвращает объект соединения, который представляет соединение с источником данных. xxxx:close()
Закрывает среду баз данных. Успешно только если вначале закрываются все соединения, относящиеся к нему. Возвращает истину (true) в случае успеха. Возвращает ложь (false), если объект уже закрыт. Действия подключения
Объект соединения содержит специфические атрибуты и параметры для одиночного соединения с источником данных. Объект соединения создается при помощи действия xxxx:connect().
Для полной интеграции с редактором скрипта следует называть объекты соединения "xxxxConnection", где "xxxx" заменяется названием базы данных, например MySQLConnection. xxxxConnection:close()
Закрывает соединение. Успещно только в случае, если все курсоры, относящиеся к нему, были закрыты, а соединение осталось открытым.
Возвращает истину (true) в случае успеха. xxxxConnection:commit()
Фиксирует (завершает) текущую транзакцию. Это свойство может не работать в системах баз данных, которые не выполняют транзакции.
Возвращает истину (true) в случае успеха. Возвращает ложь (false), если операция не может быть выполнена или не осуществлена. xxxxConnection:execute(statement)
Выполняет данную SQL инструкцию.
Если есть результат, возвращает объект курсора или, в другом случае, число рядов, затронутых командой. xxxxConnection:rollback()
Откат текущей транзакции. Это свойство может не работать в системах баз данных, которые не выполняют транзакции.
Возвращает истину (true) в случае успеха. Возвращает ложь (false), если операция не может быть выполнена или не осуществлена. xxxxConnection:setautocommit(boolean)
Включает или выключает режим "auto commit".
Это свойство может не работать в системах баз данных, которые не выполняют транзакции. Возвращает истину (true) в случае успеха. Возвращает ложь (false), если операция не может быть выполнена или не осуществлена. Действия курсора
Объект курсора содержит методы для получения данных в результате выполнения инструкции. Объект курсора создается при помощи действия xxxxConnection:execute().
Для полной интеграции с редактором скрипта следует называть объекты соединения "xxxxCursor" где "xxxx" заменяется названием базы данных, например OracleCursor. xxxxCursor:close()
Закрывает курсор.
Возвращает истину (true) в случае успеха. Возвращает ложь (false), если объект уже закрыт. xxxxCursor:fetch([table[,modestring]])
Возвращает следующую строку результата.
Если инструкция fetch вызвана без параметров, результаты будут возвращены непосредственно вызывающему. Если инструкция fetch вызвана с таблицей, результаты будут копированы в эту таблицу и измененная таблица будет возвращена. В этом случае, может быть использован дополнительный параметр modestring. Это просто строка, показывающая как должна быть построена результирующая таблица. Режим строки может содержать: "n" - результирующая таблица будет иметь числовые индексы (по умолчанию)
Числовые индексы являются позициями полей в инструкции SELECT; алфавитно-числовые индексы являются именами полей."a" - результирующая таблица будет иметь алфавитно-числовые индексы Дополнительный табличный параметр - это таблица, которая используется для хранения следующего ряда. Это позволяет использовать уникальную таблицу для множества выборок, которая может повысить общую производительность. Гарантированных типов результата нет: они могут быть конвертированы драйвером, а могут и нет, в соответствующие Lua типы. В текущей реализации драйвера PostgreSQL и MySQL возвращают все значения как строки, в то время как драйверы ODBC и Oracle конвертируют их в Lua типы. Возвращает таблицу данных, как показано выше, или нуль (ничто - nil), если рядов больше нет. Отметьте, что это действие может возвратить нуль (ничто - nil) в качестве истинного результата. Примечание: В настоящее время драйвер MySQL не поддерживает параметры дополнительной таблицы или modestring.
Единственно допустимый синтаксис это MySQLCursor:fetch(). xxxxCursor:getcolnames()
Возвращает таблицу имен столбцов.
xxxxCursor:getcoltypes()
Возвращает таблицу типов столбцов.
xxxxCursor:numrows()
Возвращает количество строк в результате запроса. Примечание: Доступно только для MySQL, Oracle и PostgreSQL.
Смотрите также: Связанные действия
ПримерыПример 1SQLite3Connection, err = SQLite3:connect("test-db"); if not SQLite3Connection and err then Dialog.Message("Error", err); end SQLite3Connection:execute("DROP TABLE people"); SQLite3Connection:execute("CREATE TABLE people(name varchar(50), email varchar(50))"); -- add a few elements from a Lua table into the database table -- добавляем несколько элементов из таблицы Lua в таблицу базы данных list = { {name = "Jose das Couves", email = "jose@couves.com"}, {name = "Manoel Joaquim", email = "manoel.joaquim@cafundo.com"}, {name = "Maria das Dores", email = "maria@dores.com"} }; for i, p in pairs(list) do SQLite3Connection:execute(string.format("INSERT INTO people VALUES ('%s', '%s')", p.name, p.email)); end -- retrieve a cursor -- получаем курсор SQLite3Cursor = SQLite3Connection:execute("SELECT name, email from people"); -- print all the rows -- печатаем все строки (ряды) row = SQLite3Cursor:fetch({}, "a"); local s = ""; while row do s = s .. (string.format("Name: %s, Email: %s\n", row.name, row.email)); -- get the next row, reusing the same table row = SQLite3Cursor:fetch(row, "a"); end Dialog.Message("The 'people' table contains", s); -- close everything -- закрываем все SQLite3Cursor:close(); SQLite3Connection:close(); Пример 2
Для MySQL, вышеупомянутый пример нужно немного изменить, так как MySQL в настоящее время не поддерживает дополнительные параметры fetch().
-- print all the rows -- печатаем все строки (ряды) local s = ""; for i = 1, MySQLCursor:numrows() do local name, email = MySQLCursor:fetch(); s = s .. "Name: " .. name .. ", Email: " .. email .. "\n"; end Dialog.Message("The 'people' table contains", s);Также можно выполнить итерацию результатов при помощи функции итератора: function rows(connection, sql_statement) local cursor = assert(connection:execute(sql_statement)); return function() return cursor:fetch() end end MySQLConnection = MySQL:connect("mydatabase"); local s = ""; for name, email in rows(MySQLConnection, "select * from contacts") do s = s .. string.format("Name: %s, Email: %s\n", name, email); end Dialog.Message("The 'people' table contains", s);
Смотрите также: Связанные действия
|