0

'person'という名前のテーブルから行を取得したいと思います。名がない場合の例外を避けるために、インジケーターを使ってやりたいと思います。これを行う方法?

私はコードを書きました:

try
{
soci::statement st = (sql.prepare << "SELECT firstname FROM person;", soci::into(r, ind));
st.execute();

while (st.fetch())
{
    if(sql.got_data())
    {
        switch(ind)
        {
        case soci::i_ok:
            std::cout << r.get<std::string>(0) << "\n";
            break;
        case soci::i_null:
            std::cout << "Person has no firstname!\n";
            break;
        }
    }else
    {
        std::cout << "There's no such person!\n";
    }
}
}

ただし、行を追加した場合にのみ、行は表示されません。

std::cout << r.get<std::string>(0) << "\n";

ifステートメントの前に、データベースからの名が表示されます。

4

2 に答える 2

1

soci::rowこの目的ではなく、使う必要があると思いますがstd::string

//...
std::string firstname;
soci::statement st = (sql.prepare << "SELECT firstname FROM person;"
                    , soci::into(firstname, ind));

//...
        case soci::i_ok:
            std::cout << firstname << std::endl;
            break;
//...
于 2013-04-26T08:37:12.057 に答える
0

データベーステーブルの行全体をクエリする場合にのみ、soci::rowを使用できます。列'firstname'のみをクエリするため、文字列に直接フェッチできます。したがって、コードは次のようになります。

soci::indicator ind;
std::string sFirstName;
try
{
soci::statement st = (sql.prepare << "SELECT firstname FROM person;", 
    soci::into(sFirstName, ind));
st.execute();

while (st.fetch())
{
    switch(ind)
    {
        case soci::i_ok: {
            std::cout << sFirstName << std::endl;
            break; }
        case soci::i_null: {
            std::cout << "Person has no first name!" << std::endl;
            break;
        }
    }
}
于 2016-06-24T11:42:25.717 に答える