#c #xcode #function #firebird
#c #xcode #функция #firebird
Вопрос:
У меня есть файлы Query.c, Query.h и main.c в проекте. Я определил функцию SQLOpen() в Query.c и вызвал ее в основном. Переменные, необходимые для выполнения функции, объявляются локально. Программа не выполняется, когда я вызываю функцию SQLOpen (0 в main, потому что она не обнаруживает одну локальную переменную ‘char logInData [256];’, определенную в функции SQLOpen ().
Запрос.c:
#include <stdio.h>
#include "/Library/Frameworks/Firebird.framework/Versions/A/Headers/ibase.h"
#include "Query.h"
#define DATABASE_PATH "/Users/Sumanth/Desktop/NewDB2.fdb"
int SQLOpen()
{
ISC_STATUS status_vector[20];
isc_db_handle database=NULL;//database = SQLGetDatabase();
char logInData [256];
short bufferLength;
sprintf(logInData, "%c%c%c%c%c%c%s%c%c%s", isc_dpb_version1,
isc_dpb_num_buffers,
1,
90,
isc_dpb_user_name,
strlen("SYSDBA"),
"SYSDBA",
isc_dpb_password,
strlen("masterkey"),
"masterkey");
bufferLength = strlen(logInData);
if (isc_attach_database(status_vector, strlen(DATABASE_PATH), DATABASE_PATH, amp;database,bufferLength, logInData))
{
isc_print_status(status_vector);
}
isc_print_status(status_vector);
// SQLTestForErrors(status_vector);
// throw(ConnectionError, "");
return 0;
}
}
Запрос.h:
#ifndef SQLQueryTest_Query_h
#define SQLQueryTest_Query_h
int SQLOpen();
#endif
main.c:
#include <stdio.h>
#include "Query.h"
#include "/Library/Frameworks/Firebird.framework/Versions/A/Headers/ibase.h"
int main(int argc, const char * argv[])
{
SQLOpen();
}
Если я выполняю эту основную функцию, я получаю ошибки (вызов функции предназначен для функции базы данных с использованием firebird, но она не подключается)
Если я включу ‘char logInData [256];’ в основную функцию, тогда она работает (подключается к базе данных). Код приведен ниже.
main.c:
#include <stdio.h>
#include "Query.h"
#include "/Library/Frameworks/Firebird.framework/Versions/A/Headers/ibase.h"
int main(int argc, const char * argv[])
{
char logInData [256];
SQLOpen();
}
почему я должен включать ‘char logInData [256];’ в main, хотя он уже объявлен в функции SQLOpen () как локальная переменная?
Почему она не считывается из функции SQLOpen()?
Пожалуйста, посмотрите на эту проблему и помогите мне в решении.
It is not displaying any error but I am unable to connect to database.
The status of status vector is :
ISC_STATUS [20]
[0] long 0
[1] long 0
[2] long -1073741909
[3] long -1073743396
[4] long -1881089127
[5] long -1881089079
[6] long -1073741909
[7] long -1880974640
[8] long 515730401
[9] long 1
[10] long -1073743404
[11] long 4180
[12] long -1073743544
[13] long -1881140636
[14] long 4096
[15] long 0
[16] long 1
[17] long -1073743488
[18] long -1073743480
[19] long -1073743404
for a successful connection to the database, the status of status vector should look like:
status_vector ISC_STATUS [20]
[0] long 1
[1] long 0
[2] long 0
[3] long 0
[4] long 0
[5] long 0
[6] long 0
[7] long 0
[8] long 0
[9] long 0
[10] long 0
[11] long 0
[12] long 0
[13] long 0
[14] long 0
[15] long 0
[16] long 0
[17] long 0
[18] long 0
[19] long 0
Комментарии:
1.Я просто отбрасываю это, но почти ничего в вашем
sprint
на самом деле не является символом, так почему вы используете%c
для спецификатора формата? Это не какой-то универсальный черный ящик магии. Прочитайте, как этоsprintf()
работает.2. У вас есть makefile ? вы используете какую — нибудь IDE? если проблема заключается в компиляции, пожалуйста, покажите, как вы ее компилируете.
3. Какую ошибку вы получаете?
4. Он не отображает никаких ошибок, но не может подключиться к базе данных. Статус вектора состояния размещен выше. Пожалуйста, посмотрите на это
Ответ №1:
Когда я объявляю ‘ISC_STATUS status_vector [20];’ в качестве глобальной переменной, она работает нормально, и я могу подключиться к базе данных.