只有在启用以下两个构建选项之一时,数据库子系统才会构建到Urho3D库中:Urho3D_Database_ODBC和Urho3D-Database_SQLITE。当两个选项都启用时,URHO3D_DATABASE_ODBC优先。这些构建选项决定子系统将使用哪个数据库API。ODBC DB API更适用于本地应用程序,尤其是游戏服务器,它允许应用程序建立与任何ODBC兼容数据库的连接,如SQLite、MySQL/MariaDB、PostgreSQL、Sybase SQL、Oracle等。另一方面,SQLite DB API适用于将SQLite数据库及其引擎嵌入应用程序本身的移动应用程序。数据库子系统使用统一的URHO3D API包装底层的DBAPI,因此在这两个构建选项之间切换时,库用户不需要或只需要很少的代码更改。
目前,该实现只支持立即执行SQL语句。准备好的报表和交易管理将在以后需要时添加。该子系统具有简单的数据库连接池功能。当使用ODBC DB API时,不应将此内部数据库连接池与ODBC连接池选项混淆。默认情况下启用内部池,除非正在使用ODBC DB API,并且在主机系统中检测到ODBC驱动程序管理器3.0或更高版本,在这种情况下,应使用ODBC连接池选项来管理数据库连接池
正在建立数据库连接
通过调用Connect()并传递一个所谓的数据库连接字符串来建立新的数据库连接。数据库连接字符串不仅标识要连接到哪个数据库,还标识其他相关的数据库连接设置,如:数据库用户id、用户密码、主机和端口号等。数据库连接字符串的格式由底层DBAPI控制。通常,在切换底层DBAPI和切换要连接的数据库时,连接字符串实际上是唯一需要更改的内容。
成功建立连接后,将返回有效的DbConnection对象。完成数据库连接后,应用程序应通过调用disconnect()来断开数据库连接。这是一个很好的练习。当Urho3D游戏引擎退出时,数据库子系统的析构函数会自动断开所有仍处于活动状态的数据库连接。
ODBC连接字符串
ODBC连接字符串的确切格式取决于特定数据库供应商的ODBC驱动程序。有关如何构造数据库连接字符串,请参阅随附的特定ODBC驱动程序文档。支持DSN和无DSN连接字符串。为了便于说明,本小节将仅以如何连接到MySQL/MariaDB数据库为例进行说明。假设MySQL/MariaDB数据库服务器在本地主机上运行,默认端口的数据库名为“test”,用户id和密码为“testuser”和“testpassword”。
DSN连接字符串
使用主机系统提供的GUI工具定义ODBC数据源。它可以是用户DSN或系统DSN。在Linux主机系统上,只需分别在“~/.odbc.ini”或“/etc/odbc.ini”中添加新的数据源条目。如果文件还不存在,请创建该文件。数据源条目必须至少包含以下信息。
# These settings assume the host system uses unixODBC as ODBC driver manager
# Settings for iODBC driver manager would be slightly different
[testDSN]
Driver=MariaDB # This is the name of the ODBC driver installed in the /etc/odbcinst.ini
Description=MariaDB test database
Server=localhost
Port=
User=testuser
Password=testpassword
Database=test
Option=3
Socket=
要连接到此数据源,请使用以下连接字符串:
DSN=testDSN
无DSN连接字符串
要连接到上述相同的数据库而不将其预先配置为ODBC数据源,请使用如下连接字符串:
Driver=MariaDB;Database=test;User=testuser;Password=testpassword;Option=3
SQLite连接字符串
SQLite数据库是单个磁盘文件。SQLite连接字符串只是指向单个磁盘文件位置的路径。绝对路径和相对路径都有效。当路径有效但磁盘文件还不存在时,SQLite数据库引擎将自动创建磁盘文件,从而在此过程中创建一个新的空数据库。这种方法的缺点是,无法传递额外的数据库连接设置。为此,SQLite DB API还支持使用RFC 3986 URI格式的连接字符串。有关详细信息,请参阅有关URI格式的SQLite文档。为了便于说明,本小节将假设SQLite磁盘文件名为“test.db”,位于主目录中,当前工作目录为主目录。
路径连接字符串
在上述假设下,以下示例连接字符串同样有效。
相对路径:
test.db
或绝对路径:
/home/testuser/test.db
URI连接字符串
在此格式中,附加的数据库连接设置可以作为查询参数传递。例如,要以只读和共享缓存模式连接到与上述相同的数据库,则可以将连接字符串重写为:
file:./test.db?mode=ro&cache=shared
或者
file:///home/testuser/test.db?mode=ro&cache=shared
立即执行SQL语句
使用Execute()以立即模式执行SQL语句。在即时模式下,SQL语句可以一次性打开、准备、执行和完成。执行即席查询是一种方便的方法,但当重复执行同一查询时,它可能对系统性能不利。无论查询类型是DML(数据操作语言)还是DDL(数据定义语言),该方法都返回DbResult对象。当正在执行的SQL语句是select查询时,DbResult对象仅包含结果集。使用GetNumColumns()和GetNumRows()查找结果集的大小。使用GetColumns()和GetRows()分别获取实际的列标题数据和行数据。对于DML语句,使用GetNumAffectedRows()查找受影响的行数。
DbResult对象中的行数可能小于从数据库中提取的实际行数。这是因为E_DBCURSOR事件处理程序可能会指示将提取的行过滤掉。在E_DBCURSOR事件处理程序的请求下,也可以中止整个行提取过程。
使用准备好的语句和动态参数绑定执行SQL
目前尚不支持。
交易管理
目前尚不支持。目前,除非数据库以只读方式连接(在这种情况下,DML和DDL语句将导致记录错误),否则所有语句都是自动提交的。
数据库游标事件
当执行SQL语句时,有一个选项可以启用数据库游标事件的发送。在提取结果集的每一行时,都会发送此事件。即事件可以在Execute()方法返回之前发送多次。应用程序可以订阅此事件以影响结果集在DbResult对象中的填充方式。
E_DBCURSOR具有输入和输出参数。
输出参数:
P_SQL SQL query string currently being executed (String)
P_NUMCOLS Number of columns in the resultset (unsigned)
P_COLHEADERS Column headers in the resultset (StringVector)
P_COLVALUES Row data as it is being fetched (VariantVector)
输入参数:
P_FILTER设置为true以从DbResult对象中筛选出此行
P_ABORT设置为true以中止进一步的提取过程
P_FILTER可以用于任何其他客户端过滤逻辑,否则很难在数据库服务器端使用WHERE或HAVING子句执行这些逻辑。使用P_ABORT时,不会影响已填充到DbResult对象中的行。