本文将介绍如何在Qt中连SQL Server数据库,假设已经具有如下软件环境:
- win7 64
- VS 2013
- Qt 5.6.0(32 msvc)
- Qt add in 1.2.5
- SQL Server 2008(32、64应该都可以)
数据库有关问题
如何用sa(或者自己建立一个登录名)登录?
新手教程使用设置sa用户登录sql server2008
更改后重启服务器才能生效,在Sql Server Configuration Manager中重启SQL Server(MSSQLSERVER)服务。
ip用localhost比较好,因为如果在不同的电脑上执行的话,可能ip不同,但是localhost却可以准确定位到ip。实现qt连接SQLserver实例
如何设置DSN名?
总的来说有两种方法:1.操作系统中配置DSN;2.在Qt程序中配置。
Qt通过ODBC连接SQL Server2008实践总结这篇文章有说第1种方法。在操作系统中配置DSN的时候,服务器是LN7XVE8H9DDB5A3(我电脑的名字,可以在sql server中local右键属性查看),hostname用的“local”。第2种,可以直接看后面我给的示例代码。
创建数据库、表相差问题
sql server 2008不允许保存更改
sql server 2008不允许保存更改,您所做的更改要求删除并重新创建以下表
工具菜单—-选项—-Designers(设计器)—-阻止保存要求重新创建表的更改 取消勾选即可。qsqlquery有两种执行sql插入语句的方法(C++ Qt设计模式(第2版)379页)
- QSqlQuery.exec(QString)
- QSqlQuery.prepare(QString)
怎么刷新SQL Server 2008中查询后的表格
点击红色“执行SQL”按钮
远程连接数据库
本地接连和远程连接的区别
SQL Server 2008本身就是网络数据库,不管是访问本地还是远程访问,区别只是服务器不同,如果是远程连接需要检查远程连接是否打开:
SQL Server 2008 R2如何开启数据库的远程连接没有SQL Server的驱动
如果qt中没有SQL Server的驱动请参考:Qt5.6.0(32位)编译SQLServer驱动(ODBC)(vs2013)。
从外网访问局域网里的数据库
这个比较麻烦,要知道局域网是没有公网的IP的,访问者和数据库同在一个局域网可以轻松访问。如果想从外网访问局域网里的数据库,需要端口映射,花生壳有这个功能,我试了一下但是没有成功。
示例code
如果要让代码运行成功,在运行代码前需要在SQL Server 2008中新建一个数据库,这里取名为testdb
,在该数据库中新建一张表,取名为Table_1
,在该表中有三个字段:apple
,beer
,tree
,均为float型,不为null。
附上一段示例代码(完整工程在这里):
//测试SQLServer
#include <QtCore/QCoreApplication>
#include <QtSql/qsql.h>
#include <QtSql/qsqldatabase.h>
#include <QtSql/qsqlquery.h>
#include <QtSql/qsqlerror.h>
#include <QtSql/qsqltablemodel.h>
#include <qstring.h>
#include <qfile.h>
#include <qdebug.h>
#include <qvariant.h>
#include <qdatetime.h>
#include <qsqlrecord.h>
bool createConnection(QString driver, QString server, QString database, QString userName, QString passWord)
{
QSqlDatabase db = QSqlDatabase::addDatabase(driver);
//方式1.在程序中配置DSN
QString dsn = QString("Driver={SQL SERVER};SERVER=%1;DATABASE=%2;UID=%3;PWD=%4").arg(server).arg(database).arg(userName).arg(passWord);//
//方式2.使用"控制面板"-"管理工具"-"数据源(ODBC)"进行配置
//QString dsn = QString::fromLocal8Bit("QTDSN");
db.setDatabaseName(dsn);
if (!db.open())
{
qDebug() << db.lastError();
return false;
}
return true;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString driver = "QODBC"; //驱动名
QString server = "LN7XVE8H9DDB5A3"; //SERVER=LN7XVE8H9DDB5A3(改成自己电脑名),或者SERVER=192.168.168.61(改成自己的IP)
QString database = "testdb"; //数据库名
QString userName = "sa"; //登录用户
QString passWord = "123456"; //登录密码
bool isConncet = createConnection(driver, server, database, userName, passWord); //连接数据库
if (!isConncet)
{
return 1; //连接失败则返回1
}
//插入
QSqlQuery insertQuery;
insertQuery.prepare("INSERT INTO Table_1 (apple, beer, tree)"
"VALUES (?, ?, ?)"); //ODBC风格
insertQuery.addBindValue(12.3); // apple
insertQuery.addBindValue(32.1); // beer
insertQuery.addBindValue(34.45);// tree
insertQuery.exec();
//查找
QSqlQuery selectQuery;
selectQuery.exec("SELECT apple, beer FROM Table_1"); //sql查询语句
while (selectQuery.next())
{
double apple = selectQuery.value(0).toDouble();
double beer = selectQuery.value(1).toDouble();
qDebug() << apple << " " << beer;
}
return a.exec();
}
可以看到程序向数据库中插入了一行数据,如果正常运行将会看到屏幕上输出12.3 32.1.