查看完整版本: [-- 大幅提高易用性,自用的数据库访问封装类(20161208更新) --]

QTCN开发网 -> Qt代码秀 -> 大幅提高易用性,自用的数据库访问封装类(20161208更新) [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

realfan 2016-12-06 12:50

大幅提高易用性,自用的数据库访问封装类(20161208更新)

旧版本链接: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支持
[attachment=16199][attachment=16198]




















请叫我乔帮主 2016-12-06 17:01

stlcours 2016-12-06 19:12
可以连接哪些数据类型?是实时写入吗?还是一个方便使用的ORM?

XChinux 2016-12-08 11:42
已整合进Tianchi库.

xiongyingeng 2017-01-15 15:23
            

erichk 2017-03-09 15:58
谁能提供个具体的测试实例学习呀。

yq5858588 2017-06-10 15:23
erichk:谁能提供个具体的测试实例学习呀。[表情] [表情] [表情] [表情] [表情] [表情]  (2017-03-09 15:58) 

是啊  我现在也是下载下来了但是不会用啊

听雨陌行 2019-05-14 10:37
yq5858588:是啊  我现在也是下载下来了但是不会用啊 (2017-06-10 15:23) 

我也不会,有些看不懂

qxf19870915 2019-06-26 09:27
可以一次插入多条数值吗?

jesse2021 2021-07-13 14:19
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了


查看完整版本: [-- 大幅提高易用性,自用的数据库访问封装类(20161208更新) --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled