• 7735阅读
  • 9回复

大幅提高易用性,自用的数据库访问封装类(20161208更新) [复制链接]

上一主题 下一主题
离线realfan
 

只看楼主 倒序阅读 楼主  发表于: 2016-12-06
旧版本链接:http://www.qtcn.org/bbs/read-htm-tid-56334.html
本次更新:
getFieldsValueFromRec改为readFieldsValueFromRec,并提高readFieldsValueFromRec,addFieldsValueToTbl,updateTblFieldsValue的易用性,不再需要指定每个字段的参数类型,代码根据传入参数,自动判断类型,传出值,也不用再传指针,相应的使用方法,也有变更:
旧版本:
int iSN;
QString strName;
double dHeight;
QDateTime dt;
QByteArray ba;
db.getFieldsValueFromRec(5,                     //记录集id
                        "sn%d", &iSN,           //字段名加类型 sn为字段名%d表示整型,&iSN传入指针,保存返回字段值
                        "name%s", &strName,     //字段名加类型 name为字段名%s表示字符串(QString)
                        "height&f", &dHeight,   //字段名加类型 height为字段名%f表示小数(double)
                        "birthday%t", &dt,      //字段名加类型 birthday为字段名%t表示时间(QDateTime)
                        "photo%b", &ba,         //字段名加类型 photo为字段名%b表示二进制流(QByteArray)
                        CDBProcess::szEnd);     //结束标志,"|"
执行后,各字段值就保存在iSN, strName等变量中了。

新版本, 不再用recordset id,打开记录集返回一个void*指针,这个指针作标识:
CDBProcess db;
db.openDB("mytest.db");
void * pQry = db.openRecordsetBySql("select * from tb1");
while(db.moveNext(pQry))
{
    db.readFieldsValueFromRec("sn",            iSN,          //int
                                                       "name",      strName, //QString
                                                       "height",    dHeight,   //double
                                                       "birthday", dt,             //QDateTime
                                                       "photo",     ba);           //QByteArray

}
db.closeRecordset(pQry);
旧版本:
db.addFieldsValueToTbl("TB1",                  //表名
                        "sn%d", iSN,           //字段名加类型 sn为字段名%d表示整型,iSN传入值
                        "name%s", &strName,     //字段名加类型 name为字段名%s表示字符串(QString), 传入QString变量指针
                        "height%f", dHeight,   //字段名加类型 height为字段名%f表示小数(double),dHeight传入值
                        "birthday%t", &dt,      //字段名加类型 birthday为字段名%t表示时间(QDateTime),传入指针
                        "photo%b", &ba,         //字段名加类型 photo为字段名%b表示二进制流(QByteArray),传入指针
                        CDBProcess::szEnd);     //结束标志,"|"

新版本
db.addFieldsValueToTbl("TB1",                  //表名
                        "sn",           iSN,
                        "name",      strName,
                        "height",    dHeight,
                        "birthday", dt,
                        "photo",     ba);

旧版本:
db.updateTblFieldsValue("TB1", "WHERE sn=20", "height%f", dHeight, "photo%b", &ba, CDBProcess::szEnd);  
新版本:
db.updateTblFieldsValue("TB1", "WHERE sn=20", "height", dHeight,
                                                                                      "photo",   ba);           
注:本版本代码需要C++11支持
DBProcess.h (9 K) 下载次数:133 DBProcess.cpp (23 K) 下载次数:138




















只看该作者 1楼 发表于: 2016-12-06
离线stlcours

只看该作者 2楼 发表于: 2016-12-06
可以连接哪些数据类型?是实时写入吗?还是一个方便使用的ORM?
离线XChinux

只看该作者 3楼 发表于: 2016-12-08
Re:大幅提高易用性,自用的数据库访问封装类(20161207更新)
已整合进Tianchi库.
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线xiongyingeng

只看该作者 4楼 发表于: 2017-01-15
            
离线erichk

只看该作者 5楼 发表于: 2017-03-09
谁能提供个具体的测试实例学习呀。
离线yq5858588

只看该作者 6楼 发表于: 2017-06-10
回 erichk 的帖子
erichk:谁能提供个具体的测试实例学习呀。[表情] [表情] [表情] [表情] [表情] [表情]  (2017-03-09 15:58) 

是啊  我现在也是下载下来了但是不会用啊
快乐大男孩
离线听雨陌行

只看该作者 7楼 发表于: 2019-05-14
回 yq5858588 的帖子
yq5858588:是啊  我现在也是下载下来了但是不会用啊 (2017-06-10 15:23) 

我也不会,有些看不懂
离线qxf19870915

只看该作者 8楼 发表于: 2019-06-26
可以一次插入多条数值吗?
离线jesse2021

只看该作者 9楼 发表于: 2021-07-13
bool readFieldsValueFromRec(const void* p, const QString str, T& t, Args& ... args) const
    {
        const QSqlQuery* pQry = static_cast<const QSqlQuery*>(p);
        if (nullptr == pQry || false == pQry->isValid())
        {
            return false;
        }
        t = pQry->value(str).value<T>();//显示“QVariant::value”: 未找到匹配的重载函数
        bool bRet = readFieldsValueFromRec(p, args...);
        return bRet;
    }
//显示“QVariant::value”: 未找到匹配的重载函数,是怎么回事呢?已经支持C11了
快速回复
限100 字节
 
上一个 下一个