首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Firebird中使用Qt存储过程

在Firebird中使用Qt存储过程
EN

Stack Overflow用户
提问于 2011-06-10 05:57:29
回答 3查看 1.2K关注 0票数 3

下午好,我从Qt和一个火鸟database.And的世界开始,完成了驱动程序的安装过程,并执行了数据库插入、更新和咨询操作。当我开始编写存储过程并在Qt中运行它们时,它并不起作用。没有失败,总是告诉我们,一切都让​​变得完美,但数据库不运行。我使用Qt 2.0.1和Firebird 2.1在Linux中编程,我创建了一个简单的存储过程测试,使其成为对表的插入。它通过运行控制台来工作,但是当尝试运行fromQt时,它不工作,并且没有给我errors.The SQL代码是:

代码语言:javascript
运行
复制
SET TERM ^ ;CREATE PROCEDURE AGREEGAR_UNO AS BEGIN insert into JUEGO(CODIGO,ESCRUTINIO,ESTADO,FECHA,HORAINICIO) values (next value for GNECODIGOJUEGO,'111,123,154,169,178','Hi', current_date, current_time);END^SET TERM ; ^
GRANT EXECUTE ON PROCEDURE AGREEGAR_UNO TO SYSDBA;

下面的代码将用于从Qt连接到firebird

代码语言:javascript
运行
复制
bool VentanaPrueba::conectar()
{
this->db= QSqlDatabase::addDatabase("QIBASE","Data");
this->db.setDatabaseName("./BD/Data.fdb");
this->db.setPassword("password");
this->db.setUserName("SYSDBA");
if(!db.open())
{
return false;
}
else
return true;
}

这是负责调用该过程的代码

代码语言:javascript
运行
复制
void VentanaPrueba::procedimiento()
{
if (!this->db.isOpen()) this->conectar();
if(this->db.isOpen())
{ QSqlQuery procedimiento = QSqlQuery::QSqlQuery(this->db);
bool bandera = procedimiento.prepare("EXECUTE PROCEDURE AGREEGAR_UNO");
QString err = procedimiento.lastError().text();
bool respuesta= procedimiento.exec();
//this->db.commit();
if(!respuesta)
{
this->db.close();
}else
{
procedimiento.finish();
this->db.commit();
this->db.close();
}


}else{
//error
}


}

非常感谢你的帮助。

EN

回答 3

Stack Overflow用户

发布于 2017-07-08 04:21:53

IBPP或InterBase Plus Plus是一个客户端接口项目,用于连接Qt和Interbase数据库系统,如firebird。使用它,你可以很容易地使用你的firebird数据库。从http://sourceforge.net/projects/ibpp/files/或ibpp官网下载其源码包,并解压。将核心文件夹复制到项目文件夹中。并将这些文件添加到Qt项目中。在https://rongsheng007.wordpress.com/2010/08/23/make-qt-applications-work-with-firebird-database/上阅读完整的指南

票数 1
EN

Stack Overflow用户

发布于 2011-06-22 19:02:32

我不知道这是否适用于firebird,但你可以尝试以下方法:

代码语言:javascript
运行
复制
procedimiento.prepare("BEGIN EXECUTE PROCEDURE AGREEGAR_UNO; END;");

这与PL/SQL段落类似

代码语言:javascript
运行
复制
BEGIN
  EXECUTE PROCEDURE AGREEGAR_UNO;
END;

我正在使用Qt访问Oracle数据库,并且必须在其中包含"BEGIN“和"END;”命令。oracle中没有"EXECUTE PROCEDURE“,但Firebird可能需要它。

另外,我使用的是Qt4,所以可能也会有所不同。

票数 0
EN

Stack Overflow用户

发布于 2016-10-12 17:38:42

有一种更简单的方法,尽管有点奇怪。

在firebird中创建一个存储过程,将一些输出变量挂起,并使用一个VARCHAR(1024)输入变量传递过程调用。

并在Qt中使用过程调用作为字符串参数来调用它。

代码语言:javascript
运行
复制
       SET TERM ^ ;
create PROCEDURE SP_EXECUTE (STMNT varchar(1024) )
    RETURNS (
        INRETURN integer )
    AS
    BEGIN
        execute statement stmnt;
    inReturn=1;
    suspend;
    END^
    SET TERM ; ^
    }

然后在Qt中,

代码语言:javascript
运行
复制
procedimiento.prepare("SELECT INRETURN FROM SP_EXECUTE('EXECUTE PROCEDURE AGREEGAR_UNO')");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6299808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档