【问题标题】:How to bound QString to QSqlQuery that call procedure which output varchar?如何将 QString 绑定到调用输出 varchar 的过程的 QSqlQuery?
【发布时间】:2018-03-26 11:02:51
【问题描述】:

我设法将整数值绑定到这种类型的查询,但我无法绑定 QString。

我不断得到空的 QVariant。但是,在 Sql server 中,我得到了我想要得到的值。

程序将输出 VARCHAR(max)

qDebug() << query.prepare("{call dbo.p_test(?)}");
query.bindValue(0, QString(""), QSql::Out);
qDebug() << query.exec();
qDebug() << query.boundValue(0);

我试过绑定:

''
""
QString()
QString("")
QVariant()
QVariant(QVariant::String)

我应该如何绑定值才能正确绑定?

我使用的是 Qt 4.8.4

附:这样做时,我可以得到我想要的字符串值。

query.exec("DECLARE @r VARCHAR(MAX); EXEC dbo.p_test @r OUTPUT; SELECT @r");
query.first();
qDebug()<<query.value(0);

更新

这真的很奇怪

  1. 我将QSql::Out 更改为QSql::InOut
  2. 我编辑了该过程,以便将值插入表中。
  3. 我把绑定命令改成了query.bindValue(0, QString("1234567"), QSql::InOut);

我检查了我在sql server中传递的值,它是

'1234567'

我检查了我从qDebug()&lt;&lt;query.boundValue(0) 得到的值,它是

QVariant(QString, "1234")

不管我的程序是否应该返回

'7654321'

CREATE PROCEDURE dbo.p_test
    @rez varchar(max)
BEGIN
    INSERT INTO test VALUES(@rez)
    SET @rez = '7654321';
END;

【问题讨论】:

  • 在这个例子中你使用的是哪个版本的 Qt?
  • 尽管我只做了一次绑定,但我已经检查了它们,它们都是空的 QVariant(, )
  • 我真的认为问题在于编码,从 sql server 到 Qt 驱动程序。看起来 sql server 将 varchar 每个转换为 2 个字节,并使用绑定值的原始大小。
  • 我刚刚使用 Qt 5.9.2 测试了一个例子,一切都像一个魅力,我可以得到我在程序中输出的值。 Qt4 和 Qt5 之间的主要区别是默认的 unicode。所以会努力找出问题所在,主要是重新编译插件,其次分析源码。
  • 此错误存在于 Qt4 中,并已在 Qt5 中修复(因此我的问题):bugreports.qt.io/browse/QTBUG-18435

标签: c++ sql-server qt


【解决方案1】:

我认为您必须正确格式化输出,

qDebug() << query.boundValue(0).toString();

或:

qDebug() << query.boundValue(0).toString().toUtf8().data();

如果您有多个有界值,则可以将QSqlQuery::boundValues() 与列表一起使用:

list.at(i).toString().toUtf8().data()

【讨论】:

  • 谢谢Mohammad,但与问题无关。这真是个奇怪的问题。我将添加更多细节。
【解决方案2】:

如 cmets 中所述

此错误存在于 Qt4 中,并已在 Qt5 中修复(因此我的问题):bugreports.qt.io/browse/QTBUG-18435 – jbh Mar 27 at 9:54

确实是个bug,在Qt4中没有办法解决。

Qt4 bug太多,今天又发现了3个bug -_- 倒霉。

【讨论】:

    猜你喜欢
    • 2019-12-06
    • 2015-06-18
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多