我已经成功连接到我的数据库,但是当我从我的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
答案 0 :(得分:1)
此代码存在许多严重问题。让我们从准备好的SQL查询的概念开始。维基百科列出two reasons使用预准备语句:
这些原因都不适用于您的代码;您只执行一次查询,并且您没有将任何输入拼接到字符串中。事实上,您查询中唯一的输入是用户名,该用户名被硬编码为"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( )