
这里以学生信息的录入与读取来作为演示,主要目的是演示数据库的 *** 作,至于数据的显示等不在演示范围内,请您自行研究。
首先,在Qt中建立一个图形界面的程序项目。
然后,我们在命令行下用sqlite命令创建了数据库 C:\StudentInfo\sutdentdatadb,并且建立了一个数据库表student,该表有四个字段ID、Name、Sex、Age,未向表中添加任何数据。
关于sqlite的简单使用,可以参考我们的另一篇经验。
2SQLite的简单使用方法
在读写SQLite数据库中,我们最主要用到的是QSqlDatabase类及QSqlQuery类,前者负责创建数据库连接并打开数据库,后者负责执行查询 *** 作。实际上前者也可以进行查询 *** 作并将结果返回给QSqlQuery对象,但是Qt并不建议这么做。
在干活前,依然是先看看Assitant,这是培养独立解决问题的一个好习惯。
好,下面给 录入 按钮的点击事件编写代码。关于如何给按钮的某一事件进行编码,可以参考我们另一篇经验。
首先在pro文件中加上sql,然后别忘了#include <QSqlDatabase>以及#include <QSqlQuery>。
好了,下面在录入按钮的槽中加入如下代码:
QSqlDatabase mydb=QSqlDatabase::addDatabase("QSQLITE","wconntosqlite");
mydbsetDatabaseName("c:\\StudentInfo\\studentdatadb");
if(mydbopen())
{
QSqlQuery query(mydb);
QString sqlstr="insert into student (ID,Name,Sex,Age) values ('"
+ui->le_id->text()+"','"
+ui->le_name->text()+"','"
+ui->le_sex->text()+"',"
+ui->le_age->text()+")";
bool isok=queryexec(sqlstr);
if(isok)
qDebug()<<"数据写入成功";
}
上面我们先调用了QSqlDatabase的静态函数addDatabase创建了一个名为wconntosqlite的连接。然后给其传递数据库名称。
如果数据库打开成功,就创建一个关联的QSqlQuery对象,最后由QSqlQuery来执行插入数据工作。
特别注意:QSqlQuery对象的创建必须在mydb open成功以后才行,否则会出错。
我们来看看效果如何。
4c++怎么做界面
我们接着来写查询按钮的代码,输入以下代码:
QSqlDatabase mydb=QSqlDatabase::addDatabase("QSQLITE","rconntosqlite");
mydbsetDatabaseName("c:\\StudentInfo\\studentdatadb");
if(mydbopen())
{
QSqlQuery query(mydb);
QString sqlstr="select from student";
bool isok=queryexec(sqlstr);
if(isok)
qDebug()<<"数据读取成功";
queryfirst();
QString result="学号:"+queryvalue(0)toString()+" "
+"姓名:"+queryvalue(1)toString()+" "
+"性别:"+queryvalue(2)toString()+" "
+"年龄:"+queryvalue(3)toString();
ui->lbl_query->setText(result);
}
与写入数据基本差不多,这里需要特别注意的是queryfirst();。看看Assistant怎么说的就知道了。原来,query对象在执行完查询语句后,query的位置被置于一个不可用的位置,如果想从query中获取数据,需要设置query到一个可用的记录中才行。方法有好几种,这里我们用了first()成员函数。
好,来看看运行结果。
可以看到软件读取的数据与控制台窗口的数据是一致的。
我们来总结下Qt *** 作SQLite数据库的五步走法决:
第一步,建立一个连接:QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE");
第二步,关联数据库文件:dbsetDatabaseName("这里你的数据库文件路径")
第三步,打开数据库:dbopen()
第四步,如果数据库打开成功,就建立一个相关联的QSqlQuery对象:QSqlQuery query(db)
第五步,执行SQL语句:queryexec("你的SQL语句字符串")
1、打开sqlserver的企业管理器或者是SQL server Management Studio
2、服务器类型选择:数据库引擎
3、服务器名称输入:localhost或是本机ip
4、身份验证选择:如果没开混合验证,选windows身份验证;如果开了混合验证,可以用windows身份登录,也可选选择SQL server身份验证。
5、选了SQLserver身份认证需要输入SQL已经定义的用户名和密码。
意思是说,还有某查询引用默认数据库连接"qt_sql_default_connection"。
如果忽略该警告,Qt官方文档里也写了,可能会出现内存泄漏:
Warning: There should be no open queries on the database connection when this function is called,
otherwise a resource leak will occur
还是不出现这个警告的好。怎么把它弄没了呢?我把一切外围的对象都排除了:仅建立一个连接,打开它,然后关闭连接,调用removeDatabase()。居然还有警告!问题已经锁定在我关闭连接的语句上:
QSqlDatabase::removeDatabase(QSqlDatabase::database()connectionName());
默认连接的名字也是默认的,需要通过connectionName()函数获得。这样写貌似没什么问题,后来调试发现,QSqlDatabase::database()静态函数实际上使默认连接的引用计数+1。上述句子相当于:
QSqlDatabase db = QSqlDatabase::database();//获得实例。
QString name = dbconnectionName();//获得默认连接名。
QSqlDatabase::removeDatabase(name);//删除默认连接。
这样,问题就清晰了,db获得了一个引用,此时引用计数为2。在调用removeDatabase()时,db对象并没有被删除,默认连接的引用计数仍为2,于是报告警告信息。
我们只需将其改为:
QString name;
{
name = QSqlDatabase::database()connectionName();
}//超出作用域,隐含对象QSqlDatabase::database()被删除。
QSqlDatabase::removeDatabase(name);
问题就解决了!
如果直接打默认连接名的话,代码就简单多了,不过名字不太好打(再说了,万一Qt把默认连接名改了呢!):
QSqlDatabase::removeDatabase("qt_sql_default_connection");//不推荐。
以上就是关于怎样在Qt下连接读写sqlite数据库全部的内容,包括:怎样在Qt下连接读写sqlite数据库、如何在arm嵌入板上用QT连接sqlserver数据库、QT访问MYSQL数据库为什么一打开子窗口访问数据库就出问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)