QT接続access


1,   ドライバのインストール
2,    接続、操作、表示
3,   中国語サポート
 
 
1-----------
まず自分でQTを取り付けて必要なDB Driverがあるかどうか確認します。
    通常QTをインストールするとSqliteをデフォルトでインストールするDriverがあります。以下のコードでテストできます。
  QSql Database m_db=QSql Database:addDatabase(「QSQLITE」); 
1.     m_db.set DatabaseName(「test.db」); 
2.     if(!mudb.open() 
3.     { 
4.        qDebug()<「DB openerror!」    
5.     } 
6.     else 
7.     { 
8.        qDebug()<「DB open Sucess!」    
9.     } 
テストODBC接続は簡単に真似できません。set DatabaseNameは簡単にデータベース名を入力するのではなく、DNS名です。DSN接続文字列を使ってODBCデータベースに直接接続することもできます。直接DNSを設定することもできます。
 
データベースドライバのテスト方法
(開く.proファイルはwin 32に追加する:CONFIG+=consolie
QT+=SQL
これでデバッグ情報が表示されます。
最初の文書で使うべきです。 
)
#include <QtGui/QApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    //w.show();
    qDebug()<< QSqlDatabase::drivers();
    return a.exec();
}
 
 
QTをインストールする時に何も配置していないと、通常はQSQLITEしか現れません。QODBC 4をインストールする必要があります。
ODBCプラグインをコンパイルします。configure-plugin-sql-odbcで保証できます。単独でコンパイルもできます。\src\plugins\sqldrivers\odbc
qmake-tvclib odbc.pro
qmake
メーク
コンパイル後、「\plugins\sqldrivers」の下にQsqlodbddlやQsqlodbc.dlがあるべきです。
 
この方法は以前は気づかなかったです。つまりQTのソースコードをコンパイルする時、一部のプラグインや機能がコンパイルされていない場合、単独で上記の方法でコンパイルすることができます。
上記の手順でODBCのQTdriverを保有しています。
それでプログラムを書くことができます。
 
 
2--------------
 
簡単に言えば、データベース名はこう書くべきです。  「Driver={microsoff accessdriver(*.mdb)];dbq=*.mdb;uid=admin;pwd=pass;
1.     QSql Database mudb=QSql Database:addDatabase("QODBC") 
2.        mudb.set DatabaseName(DRIVER={Microsoft Access Driver];FIL={MS Access};DBQ=db.mdb;UID=;PWD=> 
3.         ブック  ok=mudb.open(); 
4.        if(ok) 
5.        { 
6.        QDebug()<<データベースのオープンに成功しました。 
7.        } 
8.        else 
9.        { 
10.          QDebug()<<データベースのオープンに失敗しました;;        
11.      }  
 
QSql Databaseに設定してから通過します。
 
QSqlQuery*mugQuery=new QSqlQuery(mudb)
mupQuery->exec(「select*FROM Table 1」)という従来のsql文で操作できます。
 
プログラムを書き終えたら、対応するライブラリファイルを一緒に置く必要があります。通常のQtCore.dl QtSql.4.dllを除いて、windows下開発のQtで、mingwm 10.dlを加えます。最初は直接にQtsqlodlをプログラムの同じクラスのディレクトリの下に置いています。データベースファイルを開けられないことに気づきました。最後にフォルダを作成する必要があります。そしてqsqlodbc 4 dlを入れてもいいです。
その他の関連知識の参考
 
http://v.tampacrave.com/html/sejishikongxiangguanwenzhang/20090429/122.html
http://www.cnblogs.com/buffer/archive/2009/05/25/1488613.html
来た:http://hi.baidu.com/leonkuo1984/blog/item/0df9cdd063a81784a1ec9cf2.html
 
本論文ではQTとaccessを紹介します。まず駆動db=QSql Databaseをロードします。
データベースの接続に必要なヘッダファイル:
        #include
        #include
マイクロソフトを結ぶAccess
1.     QSql Database ldb=QSql Database::addDatabase("QODBC") 
2.     ldb.set DatabaseName(“DRIVER=”Microsoft Access Driver(*.mdb);FIL={MSAccess}、DBQ=system.mdb;UID=;PWD=xiazhset”); 
3.     book=ldb.open() 
4.     //新しいクエリーセットを定義し、リンクキーを指定します。複数の接続があれば、必要なものを任意に指定できます。 
5.     QSqlQuery mquery=QSqlQuery:QSqlQuery(ldb)         
6.     if(ok) 
7.     { 
8.     book=mquery.exec(select*from sqlguset); 
9.     if(!isok) 
10.   { 
11.   ldb.close() 
12.   return-1; 
13.   }        
14.   //これは必要です。検問の結果集は現在位置が第一条記録にないからです。 
15.   mquery.next() 
16.   QStrigs HostName=mquery.value(1).toString() 
17.   QStrigs DatabaseName=mquery.value(2).toString() 
18.   QStrigs UserName=mquery.value(3).toString() 
19.   QStrigs Password=mquery.value(4).toString() 
20.   //結果セットをクリア 
21.   mquery.clear() 
22.   // この接続が使われなくなったら、閉じることができます。 
23.   ldb.close() 
24.   //ここでは、データベースから読み出したデータをリストコントロールに書き込みます。 
25.   イ.listuout->insertItem; 
26.   イ.listuout->insertItem;     
27.   } 
28.   else 
29.   {  
30.   // ローカルデータベースを開けませんでした。 
31.   QMessageBox::critical(0,QObject::tr(Accessデータベース読み取りエラー),db.lastErr().text(); 
32.   return-1; 
33.   }               
 sql常用のヘッダファイル
璣include
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
#include <QVariant>
#include <QString>
►単一データベース接続:
►static book sql Connection(const QString&HostName)
►                          const QString&DatabaseName、
►                          const QString&UserName、
►                          const QString&Password)
►►
►    QSql Database db=QSql Database::addDatabase("QODBC")
►    db.set HostName;
►    db.set DatabaseName;
►    db.setUserName;
►    db.setPassword;
►    if(!db.open()
►    {
►        QMessageBox:critical(0,QObject:tr(Error)
►                                             QObject::tr(The database reported an error:%1).arg(db.lastErr().text())
►        return false;
►    }
►    //Qtデータベース接続後、「SET NAMES'UTF 8'」文または「SET NAMES'GBK」を実行します。
►    //db.exec("SET NAMES'UTF 8')
►    return true;

表示(3つのレイヤーに分割)
最下部 》》》》データベース(access、sql 2008、mysql、oracle)
中間層」
QSQlQuery
►QSqlQueryModel:読み取り専用のデータベースデータのモデル。
►QSql Table Model:読み書きができる単一の表のモデルで、SQL文を書かなくてもいいです。
►QSql Relational Table Model:QSql Table Modelのサブクラスは、複数のテーブルが連結されています。
►これらのクラスはQbstractTable Modelに継承されていますが、それらはQbstractItemModelに継承されています。
表示層」」」
QListView、QTablew、QTreeView QTable Widget
3-------------
標準のqtプログラムでは中国語の言語がサポートされていません。下記の二つの状況があります。コードに下記の内容を加えるだけでいいです。
1、中国語の言語を使うと文字化けが発生します。
2、データベース検索の時に結果が確認できません。
1.      要点 メール(int argc char *argv[]  
2.      {  
3.          Qiplication アプリ(argc) argv;  
4.          QText Codec:set Codec ForLocale(QText Codec:codecForName);  
5.          QText Codec:set Codec ForTr(QText Codec:codecForName);  
6.          QText Codec:set Codec ForCStrings(QText Codec:codecForName(「GBK」);  
7.          MainWindow w;  
8.          w.show();  
9.          return app.exec()  
10.    }