使用C++ Qt框架和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,它按预期插入并正确返回标识值。
发布于 2015-09-04 13:04:02
最后,在sql中找到了使用OUTPUT子句的工作。我不知道为什么我尝试过的其他方法不起作用。有一个与此特性相关的sql服务器错误,但这并不能解释为什么它在ssms中工作,而在c++ Qt代码中却不起作用。下面的例子显示了这方面的工作。下面是,我用来解决这个问题的参考。
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");
}
}https://stackoverflow.com/questions/32381543
复制相似问题