下载达梦数据库
首先可以在达梦数据库的官网下载达梦数据库:https://www.dameng.com/list_103.html
如果你的QT程序是64位的,那么就下载win64 的达梦数据库,相应的32位的QT程序要下载win32的达梦数据库。否则,程序在连接数据库时,会报 “驱动程序和应用程序之间的体系结构不匹配” 的错误。
安装并初始化达梦数据库
Windows的安装比较简单,直接用默认的配置,一直下一步就可以,直到安装完成。安装完成后初始化数据库会弹出数据库配置助手,可以选择创建数据库实例。点击开始按钮,中间的大部分步骤都可以直接下一步,使用默认配置:
这里是设置数据库的控制文件、数据文件、日志文件的存储位置:
这里初始化参数中,簇和页都是设置数据缓冲区的大小,簇就是Oracle中的区,页是Oracle中的块,是最小的存储单位,也使用默认的即可:
这里口令管理需要配置数据库的用户名和密码,如果直接下一步的话,密码口令和账号一致:
再在下一步创建示例库时,两个示例的库可以都选择上,然后点击完成后,创建数据库完成。
达梦数据库介绍
登录数据库,使用的用户名和口令就是刚才创建数据库实例的时候设置的用户名和口令:
在创建 DM 数据库时,会自动创建5个表空间:SYSTEM表空间、ROLL表空间、MAIN 表空间、TEMP表空间和HMAIN表空间。
- SYSTEM表空间:存放了有关达梦数据库的字典信息,用户不能在SYSTEM表空间创建表和索引。
- ROLL表空间:完全由DM数据库自动维护,用户无需干预。该表空间用来存放事务运行过程中执行DML操作之前的值,从而为访问该表的其他用户提供表数据的读一致性视图。
- MAIN表空间:在初始化库的时候,就会自动创建一个大小为128M的数据文件MAIN.DBF。在创建用户时,如果没有指定默认表空间,则系统自动指定 MAIN 表空间为用户默认的表空间。
- TEMP表空间:完全由DM数据库自动维护。当用户的SQL语句需要磁盘空间来完成某个操作时,DM数据库会从TEMP表空间分配临时段。如创建索引、无法在内存中完成的排序操作、SQL语句中间结果集以及用户创建的临时表等都会使用到 TEMP表空间。
- HMAIN表空间:属于HTS (HUGE TABLESPACE)表空间,完全由 DM 数据库自动维护,用户无需干涉。当用户在创建 HUGE 表时,未指定 HTS 表空间的情况下,充当默认HTS表空间。
新建表空间,可以自己定义该表空间的文件路径、大小、是否自动扩充、缓存等。除了在这里创建,也可以使用SQL语句创建,例如:
create tablespace "TEST" datafile 'TEST.DBF' size 32 CACHE = NORMAL;
创建用户,设置用户名和密码,以及该用户使用的表空间:
新建表,可以使用图形化界面创建,也可以使用SQL语句直接创建,可以指定创建表的表空间:
可以直接右键查看数据,查看每张表里面的数据:
配置ODBC
我们使用QT连接达梦数据库,是使用ODBC驱动连接的,所以需要先配置达梦数据库的ODBC驱动,先在控制面板->Windows工具中找到ODBC 数据源:
只要达梦数据库安装成功,应该都可以在这里看到达梦数据库的ODBC驱动,剩下的就是要在用户DNS中添加达梦数据库的ODBC驱动:
使用QT连接数据库
首先先要在pro文件中加入:
QT += sql
连接数据库:
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setHostName("localhost");
db.setPort(5236);
db.setDatabaseName("DMDATABASE");
db.setUserName("SYSDBA");
db.setPassword("SYSDBA");
if (db.open())
{
qDebug() << "connect ok!";
}
else
{
qDebug() << "connect fail! " << db.lastError().text();
}
清空表,初始化测试环境:
QSqlQuery query;
QString strsql = "delete from PRODUCTION.PRODUCT_CATEGORY";
if(query.exec(strsql))
{
qDebug() << "delete ok!";
}
else
{
qDebug() << "delete fail! " << query.lastError().text();
}
query.clear();
插入数据:
QSqlQuery query;
QString strsql = "insert into PRODUCTION.PRODUCT_CATEGORY(NAME) values('语文'), ('数学'), ('英语'), ('体育')";
if (query.exec(strsql))
{
qDebug() << "insert ok!";
}
else
{
qDebug() << "insert fail! " << query.lastError().text();
}
query.clear();
删除数据:
QSqlQuery query;
QString strsql = "delete from PRODUCTION.PRODUCT_CATEGORY where name='数学'";
if (query.exec(strsql))
{
qDebug() << "delete ok!";
}
else
{
qDebug() << "delete fail! " << query.lastError().text();
}
query.clear();
更新数据:
QSqlQuery query;
QString strsql = "update PRODUCTION.PRODUCT_CATEGORY set name = '英语—新课标' where name='英语';";
if (query.exec(strsql))
{
qDebug() << "update ok!";
}
else
{
qDebug() << "update fail! " << query.lastError().text();
}
query.clear();
查询数据:
QSqlQuery query;
QString strsql = "select name from PRODUCTION.PRODUCT_CATEGORY";
if (query.exec(strsql))
{
qDebug() << "select ok!";
}
else
{
qDebug() << "select fail! " << query.lastError().text();
}
while (query.next())
{
qDebug() << query.value(0).toString().toStdString().c_str();
}
query.clear();