QT连接多种数据库f方法及测试

 

QT提供了对多种数据库的访问支持,对SQL Server也可以通过ODBC来进行访问。
要想顺利访问SQL Server。 首先要保证以下几点:
1. QT编译时已经编译了QtSql
2. 编译了ODBC插件。可以通过 configure -plugin-sql-odbc来保证,也可以单独编译~/src/plugins/sqldrivers/odbc
qmake -t vclib odbc.pro
qmake
nmake
编译后,在~/plugins/sqldrivers/下应该有qsqlodbcd4.dll(debug)或qsqlodbc4.dll
此时,可以用下面的程序,测试一下你的QT目前支持哪些数据库访问。
#include <QApplication>
#include <QSqlDatabase>
#include <QStringList>
#include <QDebug>

int main(int argc, char* argv[]) {
    QApplication app(argc, argv);
    
    qDebug() << "Available drivers:";
    QStringList drivers = QSqlDatabase::drivers();
    foreach(QString driver, drivers) 
        qDebug() << "/t" << driver;
    
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
    qDebug() << "ODBC driver valid?" << db.isValid();
}

如果输出中有
Available drivers: 
"QSQLITE" 
"QODBC4" 
"QODBC" 
ODBC driver valid? true
就说明已经可以成功支持ODBC了。
3. 要连接数据库,有3种方式:
http://hi.baidu.com/wenjiejia/blog/item/1cd8ef11cbce4ecea7ef3f4b.html(详情)

QT连接数据库 是应用开发的常用基础操作。经过实验,我总结了一些例程。这些例程可以连接各种数据库。
ps:这里只是我觉得好用的方法。QT另外提供了更高级的方法,如有需要请自己尝试。

连接数据库需要的头文件:
#include <QSqlDatabase>
#include <QSqlQuery>

1、连接微软的Access----------------------------------------------------------------------------------------------
QSqlDatabase ldb = QSqlDatabase::addDatabase("QODBC");
ldb.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=system.mdb;UID=;PWD=xiaozhuset");
bool ok = ldb.open();
//新定义一个查询集合,并指定 链接关键字。 如果有多个连接,可以随意指定一个你需要的。
QSqlQuery mquery=QSqlQuery::QSqlQuery(ldb);        
if(ok)
{
bool isok=mquery.exec("select * from sql_set;");
if (!isok)
{
ldb.close();
return -1;
}       

//这个是必须的,因为查处的结果集当前位置不在第一条记录上。
mquery.next();

QString sHostName=mquery.value(1).toString();
QString sDatabaseName=mquery.value(2).toString();
QString sUserName=mquery.value(3).toString();
QString sPassword=mquery.value(4).toString();

//清除结果集
mquery.clear();
// 如果该连接不再使用,就可以关闭。
ldb.close();

//这里是将从数据库读出的数据写到一个list控件里
ui.list_out->insertItem(ui.list_out->count(),sHostName);
ui.list_out->insertItem(ui.list_out->count(),sDatabaseName);    

}
else

// 打开本地数据库失败,
QMessageBox::critical(0, QObject::tr("读取Access数据库错误!"),db.lastError().text());
return -1;
}    


2、连接mssql2000 数据库--------------------------------------------------------------------------------------------
QString strDatabaseName = QString("DRIVER={SQL Server};Server=(%1);Database=%2").arg("local").arg(sDatabaseName);    

db=QSqlDatabase::addDatabase("QODBC","db"); // 使用odbc数据库驱动 
db.setHostName(sHostName);
db.setPort(1433);
db.setDatabaseName(strDatabaseName); // 我们之前建立的数据库连接关键字
db.setUserName(sUserName); 
db.setPassword(sPassword); 
bool ok = db.open(); //尝试连接数据库
if(ok)

menuset_set->db=db;
// 这里用sa已经成功连上数据库            
return 0;
}
else

// 打开数据库失败,
QMessageBox::critical(0, QObject::tr("数据库连接错误!"),db.lastError().text());
return -2;
}        
mssql2000数据库连接的使用和Access连接使用方法一样。
QSqlQuery mquery=QSqlQuery::QSqlQuery(db);        
bool ok1=mquery.exec("select * from CarteMenu;");
if (ok1==false)return -1;
QString menu_mkey=mquery.value(13).toString();
QString strmenu_lang=mquery.value(3).toString();
//清除结果集
mquery.clear();

3、连接mysql 数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); // 使用mysql数据库驱动 
db.setHostName("localhost");
db.setDatabaseName("exampledb"); // 数据库名称
db.setUserName("sa"); // 用户名
db.setPassword("1"); // 密码
bool ok = db.open(); // 尝试连接数据库
if(ok)

QSqlQuery myquery; 
if(myquery.exec("select * from employeedb"))

int num = 0; 
if(db.driver()->hasFeature(QSqlDriver::QuerySize))
{
num = myquery.size(); // 如果支持结果影响的行数,那么直接记录下来
}
else
{
myquery.last(); //否则定位到结果最后
num = myquery.at() + 1;
}
//这里添加数据库的查询结果处理操作


else // 如果查询失败

QSqlError error = myquery.lastError();
}
}
else // 打开数据库失败
{

}

QT4如何连接MS SQL SERVER


1.网上上了很久,其实语法很简单

    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");

    db.setDatabaseName( "DRIVER={SQL Server};SERVER=127.0.0.1;UID=hello;PWD=hello;DATABASE=hello" );

2.要看连接是否正常,若有错,什么错,可以这样写

    bool r = db.open();
QSqlError err = db.lastError();
QString s = err.text();

    查看S的内容,即可得到错误内容。

3.若出错信息是驱动未加载,那么使用如下方法,可得到本地是否支持该驱动

    QApplication a(argc, argv);
qDebug() << "Available drivers:";
QStringList drivers = QSqlDatabase::drivers();
foreach(QString driver, drivers) 
qDebug() << "/t" << driver;

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
qDebug() << "ODBC driver valid?" << db.isValid();

4.若是返回结果是未支持该驱动,那么就需要重新编译sqldrivers,可以在命令行下,先使用configure,再nmake,我找到一个 简便方法,由于QT4.3.1与MS VS2005支持较好,因此安装了QT在VS2005上的插件(名称例如:qt-vsintegration-1.3.1.exe)之后,可以直接在 VS2005中,使用"QT->Open Solution from .pro file",找到QT的安装目录中的“projects.pro”,导入后,可发现几百个Project,“批生成”即可。

转载于:https://www.cnblogs.com/lvdongjie/p/5286967.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器如何实现电脑无线桥接,无线路由器WDS桥接成功副路由器下电脑无法上网怎么办【解决方法】...

摘 要无线WDS桥接设置完成后&#xff0c;在副路由器管理面&#xff0c;运行状态 无线状态 中&#xff0c;WDS状态显示成功&#xff0c;但电脑通过副路由无法上网。该问题可能与主、副路由器的设置有关&#xff0c;如下图所示&#xff1a; 解决办法&#xff1a; 排查一&#xff…

spad 探测器_从光到光子—“单光子”探测器

光电探测器光电探测器是指在光辐射作用下将其非传导电荷变为传导电荷的一类器件。在电子学中&#xff0c;二极管是一种具有不对称传输特性的双端电子元件&#xff0c;在一个方向上对电流具有低(理想为零)电阻&#xff0c;在另一个方向上具有高(理想为无限)电阻。最常见的类型如…

天地图专题五:在天地图上绘制电子区域并保存数据

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请注明出处。 上一文章讲了如何在天地图上显示坐标轨迹。 本文介绍如何在天地图上绘制电子区域&#xff08;电子范围或电子栅栏&#xff09;&#xff0c;并且&#xff0c;我们要将我们绘制的电子区域的坐标数据保存到数…

Mysql中natural join和inner join的区别

假设有如下两个表TableA&#xff0c;TableB TableA TableB Column1 Column2 Column1 Column3 1 2 1 3TableA的Column1列名和TableB的Column1列名相同。 SELECT * FROM TableA INNER JOIN TableB USING (Column1) SEL…

微信和支付宝的服务器在哪里,手机恢复出厂设置,里面支付宝与微信怎么办?原来数据在这里...

当手机使用一段时间之后&#xff0c;因为硬件落后会出现卡顿、内存不足等情况&#xff0c;这个时候提高手机速度最直接的一个办法就是恢复出厂设置&#xff0c;虽然不能从根源上解决问题&#xff0c;但是还是可以凑合个半年时间的。那么这个时候就出现一个问题&#xff0c;手机…

python线上编辑问题_python django - static文件处理与线上部署测试

static文件相关操作涉及&#xff1a;a. 文件位置与访问路径映射b. setting.py与static相关配置STATIC_URLSTATIC_ROOTSTATICFILES_DIRSc. html中对于static文件引用方式d. python manage.py collectstatic1. 开发环境-目录结构2. setting.py 设置STATIC_URL /static/# STATIC_…

android arcgis 绘制圆_arcgis for android 定位 圆

不多说直接代码 &#xff0c;群里人共享的方法一&#xff1a; /*** 绘制圆,配合 cleargraphicLayer()清除** param center 圆心* param radius 半径* param alpha 填充的透明度 0-100* param fillColor 填充的颜色*/public void DrawCircle(Point center, double radius, int a…

CreateSolidBrush

[声明] WINGDIAPI HBRUSH WINAPI CreateSolidBrush(COLORREF color); [功能] 初始化一个指定颜色的画刷。画笔可以随后被选为任何设备上下文的当前刷子。 [参数表] color 画刷的颜色[返回值] Long&#xff0c;如函数执行成功&#xff0c;就返回指向新画笔的一个句柄&#xff1b…

mysql insert 不需要日志_MySQL数据库性能优化(1)「转」

1、MySQL概述从本文开始我们将讨论建立在块存储方案之上的关系型数据库的性能优化方案和集群方案。关系型数据库的选型将以创业公司、互联网行业使用最广泛的MySQL数据为目标&#xff0c;但是MySQL的安装过程和基本使用方法等知识并不在我们讨论的范围内。后续几篇文章我们首先…

javascript面试题以及对所涉及到的知识点的总结

前言 这几天将js方面的知识系统的回顾了一遍&#xff0c;但是当尝试去做一些面试题时觉得解决问题的能力以及效率还是有所欠缺&#xff0c;在这里特意记录一下所做的面试题并总结所涉及到的相关知识点。 一、面试题、答案以及总结 1、截取字符串abcdefg的efg var str"abcd…

十代主板改win7_技嘉B460主板UEFI+GPT装win7|10代CPU装win7 Bios设置

随着英特尔十代酷睿处理器的全面上市,针对主流用户的B460平台成为了大众主要关注的目标。作为国际一线板卡品牌的技嘉科技针对十代酷睿的特点,推出了B460主板。这块主板装win7、win10都可以,但是在装win7的过程中USB设备不能使用(本站支持最新的B460/Z490等新主板驱动),需要…

Java swing中的keyListener使用事例

最近在学习Java swing&#xff0c;写了一个域内聊天室&#xff0c;实现用户登录ip,端口号之后&#xff0c;进入聊天窗口聊天&#xff1a; 通过菜单条增加了几个功能&#xff0c;边框&#xff0c;字体&#xff0c;颜色和文件传输。风格里的样式都可以通过自己选择来设置。 介绍以…

「前端」History API与浏览器历史堆栈管理

本文由尚妆前端开发工程师欲休撰写 本文发表于尚妆博客&#xff0c;欢迎订阅&#xff01; 移动端开发在某些场景中有着特殊需求&#xff0c;如为了提高用户体验和加快响应速度&#xff0c;常常在部分工程采用SPA架构。传统的单页应用基于url的hash值进行路由&#xff0c;这种实…

Andrew Ng机器学习(一):线性回归

1.什么是线性回归&#xff1f; 用线性关系去拟合输入和输出。 设输入为x&#xff0c;则输出yaxb。 对于多元的情况yb1a1x1a2x2...anxn。 用θ表示系数&#xff0c;可以写作&#xff1a; 其中&#xff0c;x01。 2.线性回归有什么用&#xff1f; 对于连续输入和输出的问题&#x…

c++虚析构函数

1.为什么基类的析构函数是虚函数&#xff1f; 在实现多态时&#xff0c;当用基类操作派生类&#xff0c;在析构时防止只析构基类而不析构派生类的状况发生。 下面转自网络&#xff1a;源地址 http://blog.sina.com.cn/s/blog_7c773cc50100y9hz.html a.第一段代码 #include<i…

ICMP(Internet Control Message Protocol)网际控制报文协议初识

ICMP是&#xff08;Internet Control Message Protocol&#xff09;Internet控制报文协议。它是TCP/IP协议族的一个子协议&#xff0c;用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用…

Linux设置RSA密钥登录

一、怎么实现双向免密登录 前提 所有服务器/etc/ssh/sshd_config文件的以下三行未被注释 RSAAuthentication yesPubkeyAuthentication yesAuthorizedKeysFile .ssh/authorized_keys举例&#xff1a; 两台服务器&#xff1a;192.168.100.134 192.168.1.140免密码登录是分用户的…

python面向对象__str__和__repr__方法

__str__方法 class Animal:def __init__(self,name,color):self.namenameself.colorcolordef __str__(self):resself.name的颜色是self.colorreturn res batAnimal(蝙蝠,黑色) print(蝙蝠的特征:%s % bat) # 蝙蝠的特征:蝙蝠的颜色是黑色 对象输出或者打印就会执行__str__方法…

函数sprintf真好用

描述&#xff1a;C 库函数 int sprintf(char *str, const char *format, ...) 发送格式化输出到 str 所指向的字符串。 声明&#xff1a; int sprintf(char *str, const char *format, ...) 参数&#xff1a; str -- 这是指向一个字符数组的指针&#xff0c;该数组存储了 C 字符…

oracle 删除主键_大数据量删除的思考 4

译者 汤健 沃趣科技数据库技术专家出品 沃趣科技在本系列的前一期文章中&#xff0c;我制作了一些图&#xff0c;突出显示了按表扫描执行大量删除操作和按索引范围扫描执行大量删除之间的主要区别。根据所涉及的数据模式&#xff0c;选择正确的策略可能对随机I/Os的数量、生…