Qt自带有QODBC驱动(封装了ODBC驱动接口),通过windows平台上提供的ODBC驱动访问支持ODBC的数据库,如Ms Access、SQL Server等 (Windows XP 自带有Access和SQL Server的ODBC Driver)。我们就用QODBC对Access数据库进行访问。
Access数据库后缀名说明
.accdb文件:accdb文件格式用于Office Access 2007 文件格式的文件扩展名,用于取代 MDB 文件扩展名。
.mdb文件:mdb文件格式是Office Access97/2000/2003数据库文件后缀名,是早期Access文件格式。
由于本人电脑支持64位的access驱动,所以qt也是按照64位的。
查看qt支持哪些数据库的驱动
QStringList strlist = QSqlDatabase::drivers();
foreach(QString strdriver,strlist)
{
qDebug() << strdriver << endl;
}
即我们的qt支持这些驱动:QSQLITE、QMYSQL、QMYSQL3、QODBC、QODBC3、QPSQL、QPSQL7
Qt SQL的API分为不同层:
驱动层
驱动层 对于QT是基于C++来实现的框架,该层主要包括QSqlDriver、QSqlDriverCreator、QSqlDriverCreatorbase、QSqlDriverPlugin and QSqlResult。这一层提供了特定数据库和SQL API层之间的底层桥梁。
SQL API层
SQL API层 对于SQL API 层提供了数据库的访问相关类,其中,QSqlDataBase类进行连接,QSqlQuery完成数据库的交互。除此之外,还有QSqlError、QSqlField、QSqlIndex and QSqlRecord类。
用户接口层
用户接口层 用户接口层的几个类实现将数据库中的数据链接到窗口部件上,这些类是使用模型/视图框架实现的,他们是更高层次的抽象,主要包括QSqlQureyModel,QSqlTableModel and QSqlRelationalTableModel。
用户接口层的类使用模型/视图框架实现了将数据库中的数据链接到窗口控件上。
QTableView是常用的内容显示视图组件。数据模型类有:QSqlQueryModel 、QSqlTableModel 、QSqlRelationalTableModel
QSqlQueryModel :通过设置SELECT语句查询获取内容,Model数据是只读的,不能进行编辑。
QSqlTableModel : 直接设置一个数据表的名称,可以获取数据表的全部记录,结果是可编辑的。
QSqlRelationalTableModel: 编辑一个数据表,将代码字段通过关系与代码表关联,将代码字段的编辑转换为直观的内容选择编辑。
怎给数据库设置密码和输入密码
需要用access软件设置。
登录怎使用用户名密码校验。
输入密码只使用QSqlDatabase类的setPassword函数即可。
void setPassword(const QString& password);
前提工作:
已经创建好mdb数据库。如test.mdb
如果没有,需要使用软件创建,如果没有合适的软件创建数据库。简单粗暴就是ODBC数据源管理程序创建。如创建test.mdb。在obdc数据源管理中,新建test.mdb数据库。这样odbc才能访问mdb数据库。
最好是结合视图模型一起使用,如模型为:QSqlTableModel,视图为:QTableView,数据源为QSqlDatabase。
qt开发步骤
1.在.pro文件中添加 QT+=sql //即用QtSql文件下的头文件、源文件
2.引用头文件
#include <QSqlDatabase> //连接数据库
#include <QSqlQuery> //执行各种sql语句
#include <QSqlError> //SQL数据库错误信息
#include <QSqlRecord> //封装数据库记录
#include <QSqlTableModel> //单个数据库表的可编辑数据模型
3.查看QT 对数据库的驱动的类型的支持(具体项目中,可以不用)
QStringList strlist = QSqlDatabase::drivers();
foreach(QString strdriver,strlist)
{
qDebug() << strdriver << endl;
}
4.连接和打开数据库
static QSqlDatabase addDatabase(const QString& type,
const QString& connectionName = QLatin1String(defaultConnection));
void setDatabaseName(const QString& name);
bool open();
void Dialog::on_pushButton_clicked()
{
QString strDBname;
QString strpassword = "123456";
QString runPath = QCoreApplication::applicationDirPath(); //获取文件运行路径
strDBname = runPath + "/test.mdb";
if(QSqlDatabase::contains("MyAccessDB"))
{
db = QSqlDatabase::database("MyAccessDB");
}
else
{
db = QSqlDatabase::addDatabase("QODBC", "MyAccessDB");
}
const QString strName(QString("DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};FIL={MS Access};DBQ=%1")
.arg(strDBname));
db.setDatabaseName(strName);//关联数据库
db.setPassword(strpassword);//输入登录数据库密码
if (!db.isValid())
{
return ;
}
if (!db.open())
{
qDebug() << db.lastError().text();
return ;
}
//前提是:test.mdb数据库有一个表TUser。
//这样写的目的就是调用sql api层和用户接口层直接让模型和数据库关联存储数据、视图显示。模型为
QSqlTableModel 类,视图为QTableView类。
QSqlTableModel *model; //model其实为类的成员变量
model = new QSqlTableModel(this,db);
ui->tableView->setModel(model);
model->setTable("TUser");
model->select();
}
5.创建表
void Dialog::on_pushButton_4_clicked()
{
//创建表
QSqlQuery query = QSqlQuery(db);
query.clear();
bool ret = query.exec("CREATE TABLE User ( userId VARCHAR(20) PRIMARY KEY, username VARCHAR(20) )");
query.clear();
}
6.插入数据
void Dialog::on_pushButton_2_clicked()
{
//插入数据
QString strid = ui->lineEdit->text();
QString strname = ui->lineEdit_2->text();
if(strid.isEmpty() || strname.isEmpty())
return;
QSqlQuery query = QSqlQuery(db);
bool bret = false;
query.clear();
bret = query.prepare("insert into TUser (fusername,fpassword,fpowerset) values (?,?,?)");
query.addBindValue(strid);
query.addBindValue(strname);
query.addBindValue("4095");
bret = query.exec();
query.clear();
model->setTable("TUser");
model->select();
}
7.修改数据
void Dialog::on_pushButton_7_clicked()
{
QModelIndex i = ui->tableView->currentIndex();
QString stroldid;
if(i.isValid())
{
int row = i.row();
stroldid = model->data(model->index(row,0)).toString();
QString strnewid = ui->lineEdit->text();
QString strname = ui->lineEdit_2->text();
QSqlQuery query = QSqlQuery(db);
query.clear();
bool ok = query.prepare("update TUser set fusername=?, fpassword=? where fusername=?");
query.bindValue(0,strnewid);
query.bindValue(1,strname);
query.bindValue(2,stroldid);
ok = query.exec();
query.clear();
model->setTable("TUser");
model->select();
}
}
8.删除数据
void Dialog::on_pushButton_5_clicked()
{
QModelIndex i = ui->tableView->currentIndex();
QString strid;
if(i.isValid())
{
int row = i.row();
strid = model->data(model->index(row,0)).toString();
QSqlQuery query = QSqlQuery(db);
query.clear();
query.prepare("delete from TUser WHERE fusername=?");
query.bindValue(0,strid);
bool ok = query.exec();
model->setTable("TUser");
model->select();
}
}
9.全部查询
void Dialog::on_pushButton_3_clicked()
{
if (!db.isOpen())
{
return;
}
QSqlQuery query(db);
query.clear();
bool ok = query.prepare("select * from TUser");
ok = query.exec();
while(query.next())//每一行的数据
{
QString qvalue = query.value(0).toString();
QString qvalue1 = query.value(1).toString();
QString qvalue2 = query.value(2).toString();
qDebug() << qvalue << qvalue1 << qvalue2 <<endl;
}
query.clear();
}
10 过滤查询
void Dialog::on_pushButton_6_clicked()
{
if (!db.isOpen())
{
return;
}
QString strid = ui->lineEdit->text();
QSqlQuery query = QSqlQuery(db);
query.clear();
bool ret = query.prepare("select * from TUser WHERE fusername=?");
query.bindValue(0,strid);
bool ok = query.exec();
while(query.next())//每一行的数据
{
QString qvalue = query.value("fusername").toString();
QString qvalue1 = query.value("fpassword").toString();
qDebug() << qvalue << qvalue1 <<endl;
}
query.clear();
}
11.删除表
void Dialog::on_pushButton_8_clicked()
{
QSqlQuery query = QSqlQuery(db);
query.clear();
query.exec("drop table user");
query.clear();
}
12.关闭数据库
void Dialog::on_pushButton_9_clicked()
{
if(db.isOpen())
{
db.close();
model->clear();
}
}