青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

堅(jiān)鋼不可奪其志 天地莫敢爭其鋒

無 限 風(fēng) 光 盡 在 我 心 彌 堅(jiān)
posts - 0, comments - 1, trackbacks - 0, articles - 1
 

最近在做QT和Win32SDK的項(xiàng)目,其中涉及到利用QT的方式訪問ACCESS數(shù)據(jù)庫.

QT利用一種類細(xì)于JAVA JDBC的方式呈現(xiàn)給用戶一種極簡單易用的訪問數(shù)據(jù)庫的方式。

好,下面我直接用代碼說話。以下是3個(gè)星期前我寫的一個(gè)類模板,專門用于訪問ACCESS。在我的設(shè)計(jì)中這個(gè)類模板的每一個(gè)實(shí)例化對象專門用于訪問一張表。
以下是頭文件component.h

#ifndef COMPONENT_H
#define COMPONENT_H

#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#pragma once
#endif

#include <QApplication>
#include <QString>
#include <QVector>
#include <QSqlTableModel>
#include <QSqlRecord>

int const PRIMARYKEY_INVALID_VALUE = -1;


template <typename T>
class SqlTableObj : public T
{
public:
    SqlTableObj() {}
    explicit SqlTableObj(typename T::PrimaryKeyType const &primaryKeyValue);

    typedef SqlTableObj<T> this_type;
    typedef QVector<this_type> CollectionType;

    static CollectionType const collection(QString const &filter = QString(""));
    static void updateState(QString const &filter = QString(""),int *a = NULL );
    static void updateStateEx( QString const &filter = QString(""),int row = 0,int index = 0,int value =0 );
    int getSignals();

private:
    static void createTableModel(QString const &filter, QSqlTableModel &model);
};

template <typename T>
SqlTableObj<T>::SqlTableObj(typename T::PrimaryKeyType const &primaryKeyValue)
{
    if (T::primaryKeyInvalidValue() != primaryKeyValue)
 {
   QSqlDatabase qdb = QSqlDatabase::database( T::connectionName(),true );
   QSqlTableModel model( 0, qdb );

        QString filter = T::primaryKeyName() + QString("=%1");
        createTableModel(filter.arg(primaryKeyValue), model);
/*
        if (1 == model.rowCount())
  {
            T::assign(model.record(0));
        }
*/
   T::assign(model.record(0));
    }
}

template <typename T> typename SqlTableObj<T>::CollectionType const
SqlTableObj<T>::collection(QString const &filter/* = QString("")*/)
{
 QSqlDatabase qdb = QSqlDatabase::database( T::connectionName(),true );
    QSqlTableModel model( 0, qdb );
    createTableModel(filter, model);

    this_type tableObj;
    CollectionType result;

    for (int i = 0; i < model.rowCount(); ++i)
 {
        tableObj.assign(model.record(i));
        if (tableObj.valid())
  {
            result.push_back(tableObj);
       }
    }

    return result;
}

template <typename T>
void SqlTableObj<T>::updateState( QString const &filter,int *a = NULL )
{
 QSqlDatabase qdb = QSqlDatabase::database( T::connectionName(),true );
 QSqlTableModel model( 0, qdb );
 createTableModel(filter, model);
/**/
 for (int i = 0; i < model.rowCount(); i++)
 {
  model.setData( model.index( i, 2 ), a[i] );//a[i]
 }

 model.submitAll();
 //
}
template <typename T>
void SqlTableObj<T>::updateStateEx( QString const &filter = QString(""),
           int index = 0,int value =0 )
{
 QSqlDatabase qdb = QSqlDatabase::database( T::connectionName(),true );
 QSqlTableModel model( 0, qdb );
 createTableModel(filter, model);

 model.setData( model.index( index, 2 ), value );

 model.submitAll();
//// model.record(index).value("state")
}
template <typename T>
void SqlTableObj<T>::updateStateEEx( QString const &filter = QString(""),
         int row = 0,int index = 0,int value =0 )
{
 QSqlDatabase qdb = QSqlDatabase::database( T::connectionName(),true );
 QSqlTableModel model( 0, qdb );
 createTableModel(filter, model);

 model.setData( model.index( row, index ), value );

 model.submitAll();
 //// model.record(index).value("state")
}
template <typename T>
int SqlTableObj<T>::getSignals()
{
 QSqlDatabase qdb = QSqlDatabase::database( T::connectionName(),true );
 QSqlTableModel model( 0, qdb );
 createTableModel("", model);
  
 model.setEditStrategy(QSqlTableModel::OnFieldChange);
 T::assign(model.record(0));

 return 0;
}
template <typename T>
void SqlTableObj<T>::createTableModel(QString const &filter, QSqlTableModel &model)
{
    model.setTable(T::internalTableName());
    model.setFilter(filter);
    model.select();
}

class ComponentTable
{
public:
    ComponentTable();

    bool valid() const { return m_id != PRIMARYKEY_INVALID_VALUE; }

    int id() const { return m_id; }

    QString const name() const { return m_name; }
    void setName(QString const &newName);

    QString const filePathName() const { return m_filePathName; }

    int minDistance() const { return m_minDistance; }
     int maxDistance() const { return m_maxDistance; }

    float direction_X() const { return m_direction_X; }
     float direction_Y() const { return m_direction_Y; }
      float direction_Z() const { return m_direction_Z; }

    int fId_1() const { return m_fId_1; }
     int fId_2() const { return m_fId_2; }
      int fId_3() const { return m_fId_3; }

    int categoryId() const { return m_categoryId; }

private:
    friend class SqlTableObj<ComponentTable>;

    typedef int PrimaryKeyType;
    static PrimaryKeyType const primaryKeyInvalidValue() { return PRIMARYKEY_INVALID_VALUE; }
////////////////////////////////////////////////////////////////////////////////
    static QString const connectionName()
 {
  return qApp->applicationDirPath() + "/Database/myhpss.mdb";
 }
    static QString const internalTableName()
 {
  return "component";
 }
    static QString const primaryKeyName() { return "ID"; }

    void assign(QSqlRecord const &record);

    int m_id;

    QString m_name;

    QString m_filePathName;

    int m_minDistance;
    int m_maxDistance;

    float m_direction_X;
    float m_direction_Y;
    float m_direction_Z;

    int m_fId_1;
    int m_fId_2;
    int m_fId_3;

    int m_categoryId;
};

typedef SqlTableObj<ComponentTable> Component;
typedef QVector<Component> ComponentArray;

#endif  //COMPONENT_H

以下是component.cpp文件
#include "component.h"

ComponentTable::ComponentTable()
{
    m_id = PRIMARYKEY_INVALID_VALUE;

    m_minDistance = -1;
    m_maxDistance = -1;

    m_direction_X = 0.0f;
    m_direction_Y = 0.0f;
    m_direction_Z = 0.0f;

    m_fId_1 = -1;
    m_fId_2 = -1;
    m_fId_3 = -1;

    m_categoryId = -1;
}

void ComponentTable::setName(QString const &newName)
{
    m_name = newName;
    //待續(xù):將新值寫入數(shù)據(jù)庫
}

void ComponentTable::assign(QSqlRecord const &record)
{
    m_id = record.value("ID").toInt();

    m_name = record.value(QObject::tr("名稱")).toString();

    m_filePathName = record.value("filePathName").toString();

    m_minDistance = record.value("minDistance").toInt();
    m_maxDistance = record.value("maxDistance").toInt();

    m_direction_X = static_cast<float>(record.value("direction_X").toDouble());
    m_direction_Y = static_cast<float>(record.value("direction_Y").toDouble());
    m_direction_Z = static_cast<float>(record.value("direction_Z").toDouble());

    m_fId_1 = record.value("fId_1").toInt();
    m_fId_2 = record.value("fId_2").toInt();
    m_fId_3 = record.value("fId_3").toInt();

    m_categoryId = record.value("categoryID").toInt();
}
那個(gè)ComponentTable類就是一個(gè)能部分說明問題的例子。
關(guān)于完整例程我將隨后補(bǔ)上。

Feedback

# re: QT中利用ODBC方式訪問ACCESS數(shù)據(jù)庫  回復(fù)  更多評論   

2007-07-31 20:54 by 騰龍居
東毛子,這又是跨平臺又是原創(chuàng)又是代碼說話,你滿足了吧!@_@

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一区一卡| 亚洲日本成人女熟在线观看| 欧美一级黄色网| 亚洲欧美久久| 欧美在线看片| 久久婷婷一区| 欧美精品1区| 国产精品第13页| 国产喷白浆一区二区三区| 国产亚洲一区二区在线观看| 精品成人一区二区三区| 亚洲国产精品福利| 99精品99| 欧美在线视频网站| 久久这里只有| 亚洲国产欧美一区二区三区同亚洲 | 欧美a级大片| 欧美视频在线一区二区三区| 国产精品毛片高清在线完整版| 国产精品无人区| 亚洲国产日韩一区| 亚洲午夜精品国产| 久久综合久久综合九色| 亚洲免费av电影| 久久精品综合一区| 国产精品草草| 亚洲第一网站| 午夜视频在线观看一区二区| 欧美激情第一页xxx| 亚洲尤物精选| 蜜臀99久久精品久久久久久软件| 欧美日韩另类综合| 亚洲国产精选| 欧美专区在线观看| av成人免费在线| 日韩午夜剧场| 欧美日韩在线播放三区| 国产精品久久看| 亚洲黄色小视频| 欧美亚洲一区在线| 91久久综合| 久久蜜桃精品| 国内精品伊人久久久久av影院| 99精品视频免费在线观看| 蜜臀av性久久久久蜜臀aⅴ| 亚洲一区二区在线看| 欧美日韩调教| 一本一本久久a久久精品牛牛影视| 久久亚洲私人国产精品va媚药| 亚洲午夜精品一区二区三区他趣| 欧美另类高清视频在线| 亚洲第一中文字幕在线观看| 久久噜噜亚洲综合| 欧美在线观看视频在线| 国产亚洲精品久久久| 亚洲欧美三级在线| 99视频精品免费观看| 欧美精品一区在线发布| 亚洲精品中文字幕在线| 亚洲福利视频三区| 欧美成年人在线观看| 91久久综合亚洲鲁鲁五月天| 欧美+日本+国产+在线a∨观看| 欧美一区二区成人6969| 国产有码一区二区| 久久天天躁狠狠躁夜夜爽蜜月| 性欧美videos另类喷潮| 国产日韩欧美三级| 香蕉av777xxx色综合一区| 一区二区免费在线观看| 欧美性大战久久久久| 亚洲一区二区三区国产| 亚洲图片在线| 国产丝袜一区二区| 国产精品专区h在线观看| 欧美亚洲一级| 99re8这里有精品热视频免费| 欧美一区成人| 亚洲影音先锋| 久久国产精品99久久久久久老狼| 国产亚洲精品激情久久| 久久精品视频免费| 久久精品国产亚洲高清剧情介绍| 韩国三级在线一区| 欧美肥婆在线| 欧美人与禽猛交乱配| 亚洲欧美成人| 午夜在线视频观看日韩17c| 国产日韩一区二区三区在线播放| 久久久久久婷| 久久精品中文字幕一区| 在线播放亚洲| 久久久不卡网国产精品一区| 久热这里只精品99re8久| 久久九九99| 亚洲日本视频| 99综合电影在线视频| 国产性做久久久久久| 欧美成人中文字幕在线| 欧美日韩国产黄| 欧美一区二区视频网站| 久久婷婷人人澡人人喊人人爽| 一区二区欧美亚洲| 久久精品国产96久久久香蕉| 日韩亚洲欧美在线观看| 欧美亚洲视频| 在线午夜精品自拍| 久久亚洲精品中文字幕冲田杏梨 | 国产美女精品免费电影| 免费在线观看一区二区| 欧美香蕉大胸在线视频观看| 欧美成人嫩草网站| 国产欧美一区二区精品忘忧草| 亚洲国产精品久久人人爱蜜臀| 欧美日韩在线一二三| 免费成人av| 国产精品美腿一区在线看| 女女同性精品视频| 亚洲一区二三| 欧美成人精品在线播放| 久久久噜噜噜久久| 国产精品久久久久久久午夜| 亚洲高清成人| 国产精品一区在线观看| 亚洲精品无人区| 亚洲国产毛片完整版| 亚洲欧美在线观看| 亚洲欧美国产毛片在线| 欧美日韩免费观看一区二区三区 | 欧美日韩亚洲一区二区三区四区 | 久久一本综合频道| 国产精品乱码一区二区三区| 日韩视频亚洲视频| 99精品热6080yy久久| 久久先锋资源| 嫩草国产精品入口| 狠狠久久五月精品中文字幕| 性伦欧美刺激片在线观看| 亚洲欧美一区二区原创| 国产精品久久久一本精品| 一区二区三区日韩精品| 亚洲制服av| 国产精品入口66mio| 亚洲一区二区三区高清不卡| 亚洲一区二区欧美| 国产精品久久国产三级国电话系列 | 伊人色综合久久天天| 久久黄色级2电影| 久久午夜视频| 亚洲激情一区二区| 欧美黑人在线观看| 日韩视频在线一区二区三区| 亚洲一区观看| 欧美主播一区二区三区| 国产亚洲欧美一区| 欧美一区=区| 嫩模写真一区二区三区三州| 在线免费观看一区二区三区| 另类天堂av| 亚洲国产精品成人精品| 亚洲另类视频| 欧美日韩亚洲另类| 亚洲一区美女视频在线观看免费| 欧美在线免费视屏| 国语自产精品视频在线看抢先版结局| 欧美制服丝袜| 亚洲电影自拍| 亚洲欧美日韩国产| 黄色精品免费| 欧美精品电影在线| 亚洲资源在线观看| 猛干欧美女孩| 亚洲午夜激情网站| 伊人色综合久久天天五月婷| 欧美美女操人视频| 欧美亚洲专区| 亚洲日本在线观看| 久久国产主播精品| 一本色道久久综合亚洲精品不卡 | 18成人免费观看视频| 欧美日韩情趣电影| 久久精品国产69国产精品亚洲 | 欧美激情综合色| 亚洲欧美另类国产| 亚洲黄网站在线观看| 欧美在线看片a免费观看| 亚洲精品乱码久久久久久按摩观| 国产精品毛片在线看| 欧美成年人视频| 欧美呦呦网站| 日韩一二三区视频| 欧美成年人视频网站| 欧美在线三区| 亚洲尤物在线视频观看| 最新亚洲视频| 在线日本成人| 国外视频精品毛片| 国产精品视频yy9099| 欧美视频手机在线| 欧美另类视频|