QSqlRelationalTableModel的Select語句會改變列的名字


不解釋QSqlRelationalTableModel是什么東西。看以下代碼:

        //3.1 創建model
model = new QSqlRelationalTableModel();
model->setTable("tyzb_xmmx");
model->setFilter(filter);
model->setSort(tyzb_xmmx::xh,Qt::AscendingOrder);

//3.2 外鍵列顯示問題
model->setRelation(tyzb_xmmx::dwdm_id,QSqlRelation("dm_dwdm","dwdm","dwmc"));
model->setRelation(tyzb_xmmx::xmlb_id,QSqlRelation("dm_xmlb","xh","lbmc"));
model->setRelation(tyzb_xmmx::zydm_id,QSqlRelation("dm_zydm","xh","zymc"));
model->setRelation(tyzb_xmmx::zjxx_id,QSqlRelation("tyzb_zjxx","xh","zjxm"));
model->setJoinMode(QSqlRelationalTableModel::LeftJoin); //外鍵列為空的行也要顯示
..........

其余的一些代碼如設置列頭顯示、調整QTableView等都省略,然后調用以下代碼:

    //4 執行查詢
QSqlRecord r = model->record();
QStringList fieldNames;
for(int i = 0; i< model->columnCount();i++){
fieldNames.append( r.fieldName(i));
}
qDebug()
<< fieldNames.join(',');

model
->select();

r
= model->record();
fieldNames.clear();
for(int i = 0; i< model->columnCount();i++){
fieldNames.append( r.fieldName(i));
}qDebug()
<< fieldNames.join(',');

查看下QDebug的輸出:

"xh,createDate,bz,isDelete,lastOperate,bnd,jzsj,xmmc,nd,ndyq,qssj,xmbh,xmdm,xmsqs,yjnryq,yap,zszjyj,zgs,dwdm_id,xmlb_id,zjxx_id,gjz,zydm_id,zypx,hcmc"
"xh,createDate,bz,isDelete,lastOperate,bnd,jzsj,xmmc,nd,ndyq,qssj,xmbh,xmdm,xmsqs,yjnryq,yap,zszjyj,zgs,dwmc,lbmc,zjxm,gjz,zymc,zypx,hcmc"

發現什么了,外鍵所在列的列名已經被Select語句更新為外鍵顯示列了,您如果在Select語句后還調用以下語句獲取列序號,是會出錯的,具體是返回-1:
 

  model->fieldIndex("zydm_id");   //返回-1

作為對比,繼續在執行過Select調用的model上調用:

    r = model->record(0);
qDebug()
<< r.field(model->fieldIndex("zymc"));
qDebug()
<< r.field(model->fieldIndex("zymc")).value();

返回以下信息:

QSqlField("zymc", QString, length: 765, precision: 0, required: no, generated: yes, typeID: 253, autoValue: false, readOnly: false)
QVariant(QString,
"集采中心")

也就是說,返回的是外鍵的顯示值,而不是外鍵值本身。

那么,能否在model中直接獲取原來的zydm_id值? 目前還沒有發現好的辦法,只有重新創建一個QSqlQuery語句,根據主鍵xh獲取:

    QSqlQuery getZydm(QString("select zydm_id from tyzb_xmmx where xh=%1").arg(r.value(tyzb_xmmx::xh).toString()));
if(getZydm.first())
qDebug()
<< getZydm.value(0);

這時返回了外鍵的鍵值: QVariant(qlonglong, 7),
很不和諧優雅的辦法啊! 暫時這樣吧,有沒有更好的請過客指點一二!

 

 

 

 

 

 

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com