在Qt中连接SQLite和MySQL数据库

来源:互联网 发布:天猫魔盒ip地址端口号 编辑:程序博客网 时间:2024/04/30 07:26

下载SQLite数据库

首先到SQLite官方网站下载:

http://www.sqlite.org/download.html

得到sqlite3.exe。即可.就可以操作数据库了。

运行cmd到该指定的目录下,使用如下命令:如

F:/软件/学习软件/数据库/SQlite/sqlite-3_6_17>sqlite3.exe test  

并有以下提示:Enter SQL statements terminated with a ";"   

 

就可以创建一个名为test的数据库了.你可以使用.help命令查看各命令.

.databases   可以得到所有的数据库。

  可以使用如下命令得到一张表,并插入数据。最后.quit退出.
F:/
软件/学习软件/数据库/SQlite/sqlite-3_6_17> create table student(id varchar(10),name varchar(20),age smallint);  
F:/
软件/学习软件/数据库/SQlite/sqlite-3_6_17> select * from student;  
F:/
软件/学习软件/数据库/SQlite/sqlite-3_6_17> insert into student values('1001' , 'lovesizhao' ,26);  
F:/
软件/学习软件/数据库/SQlite/sqlite-3_6_17> select * from student;  
1001|lovesizhao|26  
F:/
软件/学习软件/数据库/SQlite/sqlite-3_6_17> drop table student;  
F:/
软件/学习软件/数据库/SQlite/sqlite-3_6_17> .quit  

drop table student;   可以删除该表格.其实大部操作都属于SQL的相同没什么改变.

也可以将该数据库备份至output.sql,也称为重定向

sqlite3.exe test.db3 >output.sql

最后可以将数据库保存为test.db3即可。

下面讲解如何通过Qt来访问刚才建立的数据库:

 QSqlDatabase dbconn = QSqlDatabase::addDatabase("QSQLITE", "testSQLite");  
    dbconn.setDatabaseName("test.db3");  //
当前目录下的test.db3数据库文件  
    //SQLite
数据库文件可用SQLite的命令行工具(c:/sqlite3.exe 数据库名)或用SQLite GUI工具创建,SQLiteSpy   
 
    if(!dbconn.open())  
    {  
          
        return;  
    }  
 
    QTableView *view;  
    QSqlTableModel *model;  
    view = new QTableView();  
    model = new QSqlTableModel(this,dbconn);  
    model->setTable("test");  
    model->select();  
    view->setModel(model);  

也可以直接访问内存得到:如

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":memory:");
    if (!db.open()) {
        QMessageBox::critical(0, qApp->tr("Cannot open database"),
            qApp->tr("Unable to establish a database connection./n"
                     "This example needs SQLite support. Please read "
                     "the Qt SQL driver documentation for information how "
                     "to build it./n/n"
                     "Click Cancel to exit."), QMessageBox::Cancel);
        return false;
    }

    QSqlQuery query;
    query.exec("create table person (id int primary key, "
               "firstname varchar(20), lastname varchar(20))");
    query.exec("insert into person values(101, 'Danny', 'Young')");
    query.exec("insert into person values(102, 'Christine', 'Holand')");

    query.exec("create table images (locationid int, file varchar(20))");
    query.exec("insert into images values(0, 'images/oslo.png')");
    query.exec("insert into images values(1, 'images/brisbane.png')");
  

以下的操作只是往数据库中添加数据的插入操作.如果想进一步学习,请查找相当资料。


在这里我还提拱和种可以访问mysql的方法.

首先要在Qt安装好mysql的插件.

去网上下载:mingw-utils-0.3

然后将解包后在其bin目录下找到reimp.exe,拷贝到mingwbin目录下。而且要将mingwbin目录加到classpath.

则可以在cmd下使用如下命令:

t> reimp -d libmysql.lib

t>dlltool -k -d libmysql.def -l libmysql.a

注意:t的目录是mysql安装目录下。我的目录为D:/MySQL/lib/opt(而且这些目录中间不能有空格,否则得不到libmysql.a

然后转到Qt的目录下(我的为D:/Qt/4.3.2/src/plugins/sqldrivers/mysql).

运行如下命令:

qmake -o Makefile "INCLUDEPATH+=D:/MySQL/lib/include"  "LIBS+=D:/MySQL/lib/lib/opt/LIBMYSQL.a" mysql.pro

 

 mingw32-make

这样就在D:/Qt/4.3.2/plugins/sqldrivers目录下生成libqsqlmysql4.aqsqlmysql4.dll.

然后就是运行一个连接到mysql数据库,测试是否成功.

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); // 使用mysql数据库驱动
 db.setHostName("localhost");
 db.setDatabaseName("test"); //
我们之前建立的数据库
 db.setUserName("root"); //
我们创建的 yunfan 用户名
 db.setPassword("123"); // yunfan
用户的密码
 bool ok = db.open(); //
尝试连接数据库
 if(ok) { //
这里用yunfan已经成功连上数据库
  QSqlQuery query; //
新建一个查询的实例
  if(query.exec("select * from t_customer")){ //
尝试列出 employee 表的所有记录
  //
本次查询成功
   int numRows = 0; //
询问数据库驱动,是否驱动含有某种特性
   if(db.driver()->hasFeature(QSqlDriver::QuerySize)){
    numRows = query.size(); //
如果支持结果影响的行数,那么直接记录下来
   } else {
    query.last(); //
否则定位到结果最后,qt 文档说,这个方法非常慢
    numRows = query.at() + 1;
   }
   QString id, lname, fname, phone;
   QDateTime dob;
   display.append("===========================================");
   display.append(QString::fromLocal8Bit(" account | password | cname | cbalance"));
   display.append("--------------------------------------");
   while(query.next()) { //
定位结果到下一条记录
    id = query.value(0).toString();
    //lname = QString::fromLocal8Bit(query.value(1).toByteArray());
    //fname = QString::fromLocal8Bit(query.value(2).toByteArray());
    //dob = query.value(3).toDateTime();
    //phone = QString::fromLocal8Bit(query.value(4).toByteArray());
    QString result = id ;//+ " " + fname + lname + " " + (dob.toString()) + " "+phone;
    display.append(result);
   }
   display.append("============================================");
   display.append(QString("totally %1 rows").arg( numRows));
  } else { //
如果查询失败,用下面的方法得到具体数据库返回的原因
   QSqlError error = query.lastError();
   display.append("From mysql database: " + error.databaseText());
  }
 } else{ //
打开数据库失败,显示数据库返回的失败描述
  display.append("cannot open database.");
  display.append("Reason: " + db.lastError().databaseText());
 }

这只是其中一部分核心代码.