如何从SQL查询中获取浮点结果?

时间:2016-09-09 03:41:16

标签: sql qt double

我已经成功连接到我的数据库,但是当我从我的SQL数据库中选择2个单元格来设置我的两个变量的值时,它什么也没做。我将数据插入数据库没有问题。我尝试了不同的方法但没有成功。难道我正在尝试使用字符串格式进行双打?

double userHeight;
double userWeight;
QSqlQuery query;
QString retreiveUserHeight = 
    QString("SELECT Height, Weight FROM SQL1 WHERE Username='joejoe'");
query.prepare(retreiveUserHeight);
query.bindValue(0,"Height");
query.bindValue(1, "Weight");
query.exec();
userHeight = query.value(0).toInt();
userWeight = query.value(1).toInt();

我很确定语法中有一个小错误导致了这次事故,但我一直无法找到它。谢谢你的帮助。

qDebug() << "calculated" << 703*(userWeight/(userHeight*userHeight)) 
         << userWeight << userHeight ;

继承调试输出:

calculated nan 0 0

2 个答案:

答案 0 :(得分:1)

此代码存在许多严重问题。让我们从准备好的SQL查询的概念开始。维基百科列出two reasons使用预准备语句:

  • 会产生编译和优化语句的开销 虽然声明多次执行,但只有一次。 [...]
  • 准备好的语句可以抵御SQL注入,因为 参数值,稍后使用不同的值传输 协议,无需正确转义。

这些原因都不适用于您的代码;您只执行一次查询,并且您没有将任何输入拼接到字符串中。事实上,您查询中唯一的输入是用户名,该用户名被硬编码为"joejoe"

"SELECT Height, Weight FROM SQL1 WHERE Username='joejoe'"

由于没有变量输入,因此使用准备好的查询没有多大意义。也没有以下几行:

query.bindValue(0,"Height");
query.bindValue(1, "Weight");

此查询中的高度和权重是输出,而不是输入。请参阅标题为“绑定值的方法”的Qt docs for QSqlQuery中的部分,以获取有关其如何工作的说明。用于绑定准备好的SQL查询的Qt API在数据库库中是相当典型的,这里没有什么东西可以破坏。

然后我们开始:

userHeight = query.value(0).toInt();
userWeight = query.value(1).toInt();

您在此处阅读的两个变量都被声明为双打,但您在返回的toInt()而不是toDouble()上调用了QVariant。我不知道你的数据库中有什么(如果有的话)值,但如果值介于-1.0和1.0之间,它们可能会在从double转换为int期间向下舍入为零。

那就是说,你没有做任何错误检查。方法prepare()exec()返回bool,表明它们是成功还是失败。同样,toInt()toDouble()告诉您,如果传入指向bool的指针,它们是成功还是失败。值得注意的是,这两种方法在失败时也会返回零值。

答案 1 :(得分:1)

// Obtain username from somewhere
QString username = "joejoe";


// Check whether DB is open
if( db->isOpen( ) )
{
    QSqlQuery query;

    double userHeight;
    double userWeight;


    // Prepare select statement
    query.prepare   ( "SELECT Height , Weight FROM SQL1 WHERE Username = :username" );
    query.bindValue ( ":username" , username );
    query.exec      ( );

    // Check if something went wrong when executing your query
    if( query.lastError( ).text( ).trimmed( ) == "" )
    {
        // Loop through all results and handle them accordingly
        while( query.next( ) )
        {
             userHeight = query.value( 0 ).toDouble( );
             userWeight = query.value( 1 ).toDouble( );

             qDebug( ) << "calculated" << 703 * ( userWeight / ( userHeight * userHeight ) ) << userWeight << userHeight;
             qDebug( ) << "---------------------------------";
        }
    }
    else
    {
        // Display the error that occured
        QMessageBox::critical( this , tr( "SQL Error" ) , query.lastError( ).text( ) );
    }
}

我认为这就是你想要它的样子。

我已经包含了一些错误检查并更正了您的查询以正确使用.bindValue( ),因为它不是用于返回值而不是用于WHERE中的输入。

由于我对你的sql表一无所知,所以我已经包含了一个循环来查看查询的所有结果。这显然可以改变。

除此之外,如果您使用的是double,则应该投射结果.toDouble( )而不是.toInt( )