c++ - 插入sql数据库后无法检索身份字段

标签 c++ qt sql-server-2008

使用 C++ Qt 框架和 sql server 2008 我一直在尝试将记录插入到具有标识字段的表中并检索标识值。下面是一个简化的代码示例,它实际上执行了插入操作,但只是不检索标识。从 query.value(0) 返回的标识是无效的 QVariant。

QSqlQuery query(*pConn);
query.prepare("insert into [VH_MANUFACTURER]  values ('sRRS test man code','RRS type','RRS logo file',1,'RRS SEO para','RRS description','RS');"
"select SCOPE_IDENTITY();");
if(query.exec())
{
    if(query.next())
    {
        QVariant identity =   query.value(0);
        int id=identity.toInt();
    }
}

我已经尝试使用 select @@identity 而不是 scope_identity,但没有任何改进,而且 QSqlQuery .lastInsertId() 也返回了一个无效的 QVariant,见下文。

  bool bFeature = pConn->driver()->hasFeature(QSqlDriver::LastInsertId);

QSqlQuery query(*pConn);
query.prepare("insert into [VH_MANUFACTURER] ([MFG_NAME],[MFG_TYPE],[MFG_LOGO],[MFG_ACTIVE],[MFG_SEO_CONTENT],[MFG_DESCRI],[MFG_CAPMANCODE]) values ('sRRS test man code','RRS type','RRS logo file',1,'RRS SEO para','RRS description','RS')");
if(query.exec())
{
    QVariant id=query.lastInsertId();
}

hasFeature 返回 true,因此驱动程序应该支持我正在尝试做的事情。 只是为了测试 sql,我直接通过 Sql Server Management Studio 运行 sql,它按预期插入并正确返回标识值。

最佳答案

终于找到了解决在 sql 中使用 OUTPUT 子句的方法。我不完全知道为什么我尝试过的其他方法不起作用。有一个sql server bug与此功能相关联,但这并不能解释为什么它在 ssms 中有效,但在 c++ Qt 代码中无效。下面的示例显示了解决方法。 Here's我用来解决这个问题的引用。

bool bFeature = pConn->driver()->hasFeature(QSqlDriver::LastInsertId);

QSqlQuery query(*pConn);
query.prepare("insert into [VH_MANUFACTURER] ([MFG_NAME],[MFG_TYPE],[MFG_LOGO],[MFG_ACTIVE],[MFG_SEO_CONTENT],[MFG_DESCRI],[MFG_CAPMANCODE]) OUTPUT INSERTED.MFG_ID values ('sRRS test man code','RRS type','RRS logo file',1,'RRS SEO para','RRS description','RS')");
if(query.exec())
{
    if(query.next())
    {
         QVariant id=query.value("MFG_ID");
    }

}

关于c++ - 插入sql数据库后无法检索身份字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32381543/

相关文章:

sql - 将值拆分为多行

c++ - Json Cpp isMember() 总是返回 True

java - JNI : convert Primitive type to jobject Or SetObjectArrayElement of Object type after casting

c++ - 删除 QMessageBox 中按钮上的图标

qt - 在QML中拖动元素时如何实时获取鼠标坐标?

sql-server-2008 - SQL Server 不使用将日期时间与非空值进行比较的索引

c++ - 如何在新调用中使用更多参数?

c++ - 仅当变量达到特定值时激活的断点

database - 在 Linux 中打开 MS Access 文件

sql - vb6 ADODB 连接字符串到 sql server 2008