在 Firebird 中使用 Qt 存储过程

Posted

技术标签:

【中文标题】在 Firebird 中使用 Qt 存储过程【英文标题】:using Qt Stored procedure in Firebird 【发布时间】:2011-09-12 02:10:29 【问题描述】:

下午好, 我开始在 Qt 和 Firebird 数据库的世界。完成驱动程序安装过程并执行数据库插入、更新和咨询操作。 当我开始制作存储过程并从 Qt 运行它们时不起作用。不会失败,我们总是认为一切都变得完美,但数据库没有运行。 我正在使用 Qt 2.0.1 和 Firebird 2.1 在 Linux 中编程 我创建了一个简单的存储过程测试,将其插入到表中。它通过运行控制台工作,但是当尝试从Qt运行时不起作用并且没有给我任何错误。SQL代码是:

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

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;

这是负责调用过程的代码

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




非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

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

procedimiento.prepare("BEGIN EXECUTE PROCEDURE AGREEGAR_UNO; END;");

这类似于 PL/SQL 段落

BEGIN
  EXECUTE PROCEDURE AGREEGAR_UNO;
END;

我正在使用 Qt 访问 Oracle 数据库,并且必须包含“BEGIN”和“END;”那里的命令。您在 oracle 中没有“执行程序”,但 Firebird 可能需要它。 另外,我使用的是 Qt 4,所以可能也会有所不同。

【讨论】:

【参考方案2】:

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

在 firebird 中创建一个存储过程,其中包含一些要挂起的输出变量,以及一个 VARCHAR(1024) 输入变量来传递过程调用。

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

       SET TERM ^ ;
create PROCEDURE SP_EXECUTE (STMNT varchar(1024) )
    RETURNS (
        INRETURN integer )
    AS
    BEGIN
        execute statement stmnt;
    inReturn=1;
    suspend;
    END^
    SET TERM ; ^
    

然后在Qt中,

procedimiento.prepare("SELECT INRETURN FROM SP_EXECUTE('EXECUTE PROCEDURE AGREEGAR_UNO')");

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于在 Firebird 中使用 Qt 存储过程的主要内容,如果未能解决你的问题,请参考以下文章

IBExpert中的Firebird在访问某些存储过程时会引发错误

如何将值的数组参数输入到 Firebird 存储过程?

Firebird 数据库使用经验总结

EF 4.1 Code First - 在 Firebird 数据库中存储图像

如何在存储过程的执行语句中使用生成器?

Firebird 2.1 在某些数据库表中存储大量行是不是有效?