1

QSqlQuery :: bindValueを使用すると行を返さないQSqlQueryを呼び出しますが、QString::argを使用して値を追加すると行を返します。

具体的には、これは何も返しません。

QSqlQuery q(QSqlDatabase::database( mDbAdapter->dbFilename() ));
q.prepare("select Focus.TextFormId as ID, Focus, TextForm, Gloss from (select TextFormId,group_concat( Transcription , ' ' ) as TextForm, group_concat( Gloss , '-' ) as Gloss from (select TextFormId,AllomorphId,Allomorph.Form as Transcription,LexicalEntryGloss.Form as Gloss from MorphologicalAnalysisMembers,Allomorph,LexicalEntryGloss where TextFormId in ( select TextFormId from MorphologicalAnalysisMembers where AllomorphId in (select _id from Allomorph where  LexicalEntryId=:LexicalEntryId and WritingSystem=:TextFormWS) ) and AllomorphId = Allomorph._id and Allomorph.LexicalEntryId = LexicalEntryGloss.LexicalEntryId and LexicalEntryGloss.WritingSystem=:GlossWS order by TextFormId, AllomorphOrder) group by TextFormId ) as Concatenation left join  ( select TextFormId, Form as Focus from Allomorph,MorphologicalAnalysisMembers on Allomorph._id=MorphologicalAnalysisMembers.AllomorphId and LexicalEntryId=:LexicalEntryId ) as Focus on Focus.TextFormId = Concatenation.TextFormId;");
q.bindValue(":LexicalEntryId", mLexicalEntryId);
q.bindValue(":GlossWS", mGlossWs.id());
q.bindValue(":TextFormWS", mTextFormWs.id());
if( !q.exec() )
    qWarning() << q.lastError().text() << q.executedQuery();

これは適切な結果を返しますが

QSqlQuery q(QSqlDatabase::database( mDbAdapter->dbFilename() ));
q.prepare(
        QString("select Focus.TextFormId as ID, Focus, TextForm, Gloss from (select TextFormId,group_concat( Transcription , ' ' ) as TextForm, group_concat( Gloss , '-' ) as Gloss from (select TextFormId,AllomorphId,Allomorph.Form as Transcription,LexicalEntryGloss.Form as Gloss from MorphologicalAnalysisMembers,Allomorph,LexicalEntryGloss where TextFormId in ( select TextFormId from MorphologicalAnalysisMembers where AllomorphId in (select _id from Allomorph where  LexicalEntryId=%1 and WritingSystem=%3) ) and AllomorphId = Allomorph._id and Allomorph.LexicalEntryId = LexicalEntryGloss.LexicalEntryId and LexicalEntryGloss.WritingSystem=%2 order by TextFormId, AllomorphOrder) group by TextFormId ) as Concatenation left join  ( select TextFormId, Form as Focus from Allomorph,MorphologicalAnalysisMembers on Allomorph._id=MorphologicalAnalysisMembers.AllomorphId and LexicalEntryId=%1 ) as Focus on Focus.TextFormId = Concatenation.TextFormId;")
        .arg(mLexicalEntryId).arg(mGlossWs.id()).arg(mTextFormWs.id())
        );
if( !q.exec() )
    qWarning() << q.lastError().text() << q.executedQuery();

データベース全体を再現するのはかなり難しいでしょうが、よりわかりやすい形式でクエリを次に示します。

select Focus.TextFormId as ID, Focus, TextForm, Gloss from (select TextFormId,group_concat( Transcription , ' ' ) as TextForm, group_concat( Gloss , '-' ) as Gloss
from 
(select TextFormId,AllomorphId,Allomorph.Form as Transcription,LexicalEntryGloss.Form as Gloss 
    from MorphologicalAnalysisMembers,Allomorph,LexicalEntryGloss 
    where TextFormId in 
        ( select TextFormId from MorphologicalAnalysisMembers where AllomorphId in 
            (select _id from Allomorph where  LexicalEntryId=%1 and WritingSystem=%3) ) 
        and AllomorphId = Allomorph._id 
        and Allomorph.LexicalEntryId = LexicalEntryGloss.LexicalEntryId 
        and LexicalEntryGloss.WritingSystem=%2 
        order by TextFormId, AllomorphOrder) 
    group by TextFormId ) as Concatenation 
    left join  
    ( select TextFormId, Form as Focus from Allomorph,MorphologicalAnalysisMembers 
        on Allomorph._id=MorphologicalAnalysisMembers.AllomorphId and LexicalEntryId=%1 ) 
    as Focus on Focus.TextFormId = Concatenation.TextFormId;

クエリを改善する方法はおそらくあると思いますが、ドキュメントを検索しましたが、QSqlQuery::bindValueに制限があることを示すものは見つかりませんでした。

4

1 に答える 1

1

最終的に、値のバインド方法を変更することで、これをバインドで機能させることができました。異なるプレースホルダーを使用して2回挿入した場合mLexicalEntryId(以下の最初の例)、または?を使用した場合に機能します。バインディング値の表記(以下の2番目の例)。それ以外の場合はプレースホルダーを使用することを好みますが、同じ変数に対して2つの異なるプレースホルダーを使用するのはばかげていると感じるので、これを使用しますか?表記。

q.prepare("select Focus.TextFormId as ID, Focus, TextForm, Gloss from (select TextFormId,group_concat( Transcription , ' ' ) as TextForm, group_concat( Gloss , '-' ) as Gloss from (select TextFormId,AllomorphId,Allomorph.Form as Transcription,LexicalEntryGloss.Form as Gloss from MorphologicalAnalysisMembers,Allomorph,LexicalEntryGloss where TextFormId in ( select TextFormId from MorphologicalAnalysisMembers where AllomorphId in (select _id from Allomorph where  LexicalEntryId=:One and WritingSystem=:Three) ) and AllomorphId = Allomorph._id and Allomorph.LexicalEntryId = LexicalEntryGloss.LexicalEntryId and LexicalEntryGloss.WritingSystem=:Two order by TextFormId, AllomorphOrder) group by TextFormId ) as Concatenation left join  ( select TextFormId, Form as Focus from Allomorph,MorphologicalAnalysisMembers on Allomorph._id=MorphologicalAnalysisMembers.AllomorphId and LexicalEntryId=:Four ) as Focus on Focus.TextFormId = Concatenation.TextFormId;");
q.bindValue(":One", mLexicalEntryId);
q.bindValue(":Two", mGlossWs.id());
q.bindValue(":Three", mTextFormWs.id());
q.bindValue(":Four", mLexicalEntryId);

q.prepare("select Focus.TextFormId as ID, Focus, TextForm, Gloss from (select TextFormId,group_concat( Transcription , ' ' ) as TextForm, group_concat( Gloss , '-' ) as Gloss from (select TextFormId,AllomorphId,Allomorph.Form as Transcription,LexicalEntryGloss.Form as Gloss from MorphologicalAnalysisMembers,Allomorph,LexicalEntryGloss where TextFormId in ( select TextFormId from MorphologicalAnalysisMembers where AllomorphId in (select _id from Allomorph where  LexicalEntryId=? and WritingSystem=?) ) and AllomorphId = Allomorph._id and Allomorph.LexicalEntryId = LexicalEntryGloss.LexicalEntryId and LexicalEntryGloss.WritingSystem=? order by TextFormId, AllomorphOrder) group by TextFormId ) as Concatenation left join  ( select TextFormId, Form as Focus from Allomorph,MorphologicalAnalysisMembers on Allomorph._id=MorphologicalAnalysisMembers.AllomorphId and LexicalEntryId=? ) as Focus on Focus.TextFormId = Concatenation.TextFormId;");
q.addBindValue(mLexicalEntryId);
q.addBindValue(mTextFormWs.id());
q.addBindValue(mGlossWs.id());
q.addBindValue(mLexicalEntryId);
于 2013-02-06T09:08:34.070 に答える