本文将介绍如何在Qt中连SQL Server数据库,假设已经具备以下软件环境:html
如何用sa(或者本身创建一个登陆名)登陆?c++
新手教程使用设置sa用户登陆sql server2008sql
更改后重启服务器才能生效,在Sql Server Configuration Manager中重启SQL Server(MSSQLSERVER)服务。数据库
ip用localhost比较好,由于若是在不一样的电脑上执行的话,可能ip不一样,可是localhost却能够准肯定位到ip。实现qt链接SQLserver实例设计模式
如何设置DSN名?服务器
总的来讲有两种方法:1.操做系统中配置DSN;2.在Qt程序中配置。markdown
Qt经过ODBC链接SQL Server2008实践总结这篇文章有说第1种方法。在操做系统中配置DSN的时候,服务器是LN7XVE8H9DDB5A3(我电脑的名字,能够在sql server中local右键属性查看),hostname用的“local”。第2种,能够直接看后面我给的示例代码。网络
sql server 2008不容许保存更改app
sql server 2008不容许保存更改,您所作的更改要求删除并从新建立如下表
工具菜单—-选项—-Designers(设计器)—-阻止保存要求从新建立表的更改 取消勾选便可。工具
qsqlquery有两种执行sql插入语句的方法(C++ Qt设计模式(第2版)379页)
点击红色“执行SQL”按钮
本地接连和远程链接的区别
SQL Server 2008自己就是网络数据库,无论是访问本地仍是远程访问,区别只是服务器不一样,若是是远程链接须要检查远程链接是否打开:
SQL Server 2008 R2如何开启数据库的远程链接
没有SQL Server的驱动
若是qt中没有SQL Server的驱动请参考:Qt5.6.0(32位)编译SQLServer驱动(ODBC)(vs2013)。
从外网访问局域网里的数据库
这个比较麻烦,要知道局域网是没有公网的IP的,访问者和数据库同在一个局域网能够轻松访问。若是想从外网访问局域网里的数据库,须要端口映射,花生壳有这个功能,我试了一下可是没有成功。
若是要让代码运行成功,在运行代码前须要在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.