• 9372阅读
  • 8回复

[提问]关于insert语句的返回值 [复制链接]

上一主题 下一主题
离线ljt20061908
 

只看楼主 倒序阅读 楼主  发表于: 2014-05-14
我用insert语句向数据中插入一条记录,记录中有一个是自增的字段id,在sql server中可用通过下面语句获得自增的id。
如:INSERT INTO jobs (job_desc,min_lvl,max_lvl)VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS 'Identity'
但是:QSqlQuery query;
QString strSql = 上面语句;
query.exec(strSql);
if(query.next())//j返回false
{
}
直接query.value(0)也得不到值;
请问如果获得自增的id
离线realfan

只看该作者 1楼 发表于: 2014-05-14
自增id字段,插数据时,可以不用管。

SELECT @@IDENTITY AS 'Identity'
QSqlQuery支持吗?你看看exec有没有执行成功
离线ljt20061908

只看该作者 2楼 发表于: 2014-05-15
回 realfan 的帖子
realfan:自增id字段,插数据时,可以不用管。
SELECT @@IDENTITY AS 'Identity'
QSqlQuery支持吗?你看看exec有没有执行成功 (2014-05-14 22:05) 

插入语句正确执行了,插入数据时自增的是没管,但是我得及时获得自增id,SELECT @@IDENTITY AS 'Identity'在SQL server查询中是能获取返回值的,我想问的是Qt中怎么获得这个返回值,现在的问题是插入正确,但是获取返回值获取不到
离线labhome

只看该作者 3楼 发表于: 2014-05-15
qry.lastInsertId()
离线labhome

只看该作者 4楼 发表于: 2014-05-15
INSERT INTO jobs (job_desc,min_lvl,max_lvl)VALUES ('Accountant',12,125)
QSqlQuery query;
QString strSql = 上面语句;
query.exec(strSql);
int id = query.lastInsertId().toInt();
离线realfan

只看该作者 5楼 发表于: 2014-05-15
回 ljt20061908 的帖子
ljt20061908:插入语句正确执行了,插入数据时自增的是没管,但是我得及时获得自增id,SELECT @@IDENTITY AS 'Identity'在SQL server查询中是能获取返回值的,我想问的是Qt中怎么获得这个返回值,现在的问题是插入正确,但是获取返回值获取不到 (2014-05-15 08:41) 

f(query.next())//j返回false说明没有记录

如果不行,就用select max(id) as maxid from jobs来取吧
离线ljt20061908

只看该作者 6楼 发表于: 2014-05-15
回 labhome 的帖子
labhome:INSERT INTO jobs (job_desc,min_lvl,max_lvl)VALUES ('Accountant',12,125)
QSqlQuery query;
QString strSql = 上面语句;
query.exec(strSql);
int id = query.lastInsertId().toInt(); (2014-05-15 10:19) 

谢谢,试过了SQl SERVER好像不支持,MYSQL应该是行的,最后我用了一个简单的存储过程实现了需要的功能
离线ljt20061908

只看该作者 7楼 发表于: 2014-05-15
回 realfan 的帖子
realfan:f(query.next())//j返回false说明没有记录
如果不行,就用select max(id) as maxid from jobs来取吧
 (2014-05-15 10:21) 

如果这样的话没办法同时多个人操作数据库,
离线ljt20061908

只看该作者 8楼 发表于: 2014-05-15
贴出解决方法,最后使用简单的存储过程了:
CREATE PROCEDURE GetNewDepartmentId
    -- Add the parameters for the stored procedure here
    @departmentName nvarchar(50),
    @validFlag bit,
    @passwordFlag bit,
    @password nvarchar(50),
    @defaultResult nvarchar(MAX),
    @displayOrder int,
    @departmentId int out
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    insert into Department(name, validFlag, passwordFlag, password, defaultResult, displayOrder) values(@departmentName, @validFlag, @passwordFlag, @password, @defaultResult, @displayOrder) select @departmentId=@@IDENTITY
END
GO

调用过程:
QString strSql = QString("exec GetNewDepartmentId %1, %2, %3, %4, %5, %6, ? out")
                    .arg("'" + information.name +"'")
                    .arg(information.validFlag ? "1" : "0")
                    .arg(information.passwordFlag ? "1" : "0")
                    .arg(information.password.isEmpty() ? "NULL" : ("'" + information.password + "'"))
                    .arg(information.defaultResult.isEmpty() ? "NULL" : ("'" + information.defaultResult + "'"))
                    .arg(QString::number(information.displayOrder, 10));
                query.prepare(strSql);
                query.bindValue(0, QVariant(QVariant::Int), QSql::Out);
                if (!query.exec())
                {
                    QMessageBox::about(this, tr("database error"), tr("insert data error"));
                    WriteLog(LOGERROR, __FILE__, __LINE__, "strSql:" + strSql + "  lastError:" + query.lastError().text());
                    return;
                }
                information.id = query.boundValue(0).toInt();
快速回复
限100 字节
 
上一个 下一个