используя хранимую процедуру Qt в Firebird - PullRequest
3 голосов
/ 10 июня 2011

Добрый день, я начинаю с мира Qt и базы данных Firebird. Завершаю процесс установки драйвера и выполняю операции по вставке, обновлению и консультации по базе данных.Когда я начал делать хранимые процедуры и запускать их из Qt не работал.Не подводит нас и всегда, что все сделано идеально, но база данных не запускается.Я программирую в Linux, используя Qt 2.0.1 и Firebird 2.1. Я создаю простой тест хранимой процедуры, который делает его вставкой в ​​таблицу.Он работает при запуске консоли, но при попытке запуска из 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;

Следующий код будет использоваться для подключения к firebird из Qt

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
}


}

Большое спасибо за помощь.

Ответы [ 3 ]

1 голос
/ 07 июля 2017

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/

0 голосов
/ 12 октября 2016

Есть более простой способ, хотя и немного странный.

Создайте хранимую процедуру в 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')");
0 голосов
/ 22 июня 2011

Я не могу сказать, работает ли это для firebird, но вы можете попробовать следующее:

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

Это похоже на отрывок из PL / SQL

BEGIN
  EXECUTE PROCEDURE AGREEGAR_UNO;
END;

Я обращаюсь к базам данных Oracle с помощью Qt, и мне пришлось включить "BEGIN" и "END;" Команды там. У вас нет «EXECUTE PROCEDURE» в oracle, но это может потребоваться для Firebird.
Кроме того, я использую Qt 4, поэтому может быть и разница.

...