2016-08-05 2 views
0

Я пытаюсь читать из базы данных по строкам. Я получаю предупреждение о том, что состояние «присваивание делает целое число из указателя без cast [включен по умолчанию» для всех строк, содержащих функцию sqlite3_column_text(). Однако такая ошибка не возникает в строке, в которой я пытаюсь получить целое число, хотя эта строка все еще возвращает 0 из базы данных.Невозможно прочитать из базы данных SQLite

rc обращение удален для компактности.

typedef struct { 
    char InstrumentType[32]; 
    char Protocol[16]; 
    int RegNum; 
    char RW[4]; 
    char RegisterType[32]; 
    char Signed[8]; 
    char Inverted[8]; 
    char DataType[16]; 
} Register; 

typedef struct { 
     char InstrumentType[32]; 
     int Bus; 
     int Address; 
     int Port; 
     int Sampling; 
     char Sync[2]; 
     Register Reg[]; 
     } Instrument; 

int main(void) { 
    sqlite3 *db; 
    Register Register[8]; 
    sqlite3_stmt* SQL; 
    char SQL2[128]; 
    int i; 
    int MPTotalReg; 

    int rc; 

    rc = sqlite3_open("/root/BBBTest/Instruments.db", &db); 

    for (i=0; i<4; i++){ 

    rc = sqlite3_prepare_v2(db, "SELECT * from instrumentsdefinition WHERE Type='Magprobe' AND Register=?;", -1, &SQL, 0); 

    rc = sqlite3_bind_int(SQL, 1, i); 

     *Register[i].InstrumentType=(const char*) sqlite3_column_text(SQL,2); 
     *Register[i].Protocol=(const char*) sqlite3_column_text(SQL,3); 
     Register[i].RegNum= sqlite3_column_int(SQL,5); 
     *Register[i].RW=(const char*) sqlite3_column_text(SQL,5); 
     *Register[i].RegisterType=(const char*) sqlite3_column_text(SQL,6); 
     *Register[i].Signed=(const char*) sqlite3_column_text(SQL,7); 
     *Register[i].Inverted=(const char*) sqlite3_column_text(SQL,8); 
     *Register[i].DataType=(const char*) sqlite3_column_text(SQL,9); 
     printf("Magprobe %d\n", i); 
     printf("Instrument Type: "); 
     printf("%s\n", Register[i].InstrumentType); 
     printf("Protocol: "); 
     printf("%s\n", Register[i].Protocol); 
     printf("Register: "); 
     printf("%d\n", Register[i].RegNum); 
     printf("R/W?: "); 
     printf("%s\n", Register[i].RW); 
     printf("Register Type: "); 
     printf("%s\n", Register[i].RegisterType); 
     printf("Signed?: "); 
     printf("%s\n", Register[i].Signed); 
     printf("Inverted?: "); 
     printf("%s\n", Register[i].Inverted); 
     printf("Data Type: "); 
     printf("%s\n", Register[i].DataType); 
    } 
     sqlite3_finalize(SQL); 
     sqlite3_close(db); 

    return EXIT_SUCCESS; 
} 

Я знаю, что ошибка связана с массивами и символами char, однако я испробовал множество способов исправить это. Также тот факт, что возвращаемый int всегда 0, приводит меня к мысли, что есть ошибка с моей инструкцией по подготовке или привязке.

+0

Вы не можете назначать массивы в C; вам нужно скопировать содержимое строки. –

+0

@CL. Как я могу это сделать? – Mst137

ответ

1

Использование вы не можете присвоить массив к другому, вы должны скопировать содержимое исходного массива в массив назначения, например, с помощью strcpy

unsigned char *value = sqlite3_column_text(SQL,2); 
if ((value != NULL) && (strlen(value) < sizeof(Register[i].InstrumentType))) 
{  
    strcpy(Register[i].InstrumentType, value); 
} 

В вашем конкретном случае, вы можете также использовать указатели, чтобы сделать это рефакторинг вашей структуры.

Register[i].InstrumentType=(const char*) sqlite3_column_text(SQL,2); 
if (Register[i].InstrumentType != NULL) 
{ 
    //... 
} 

Я написал ваш конкретный случай из-за того, что как только вы звоните sqlite3_finalize, возвращаемые значения из sqlite3_column_tex т становятся недействительными.


Другое дело, выполнение запроса, после привязки вы должны вызвать

rc = sqlite3_step(stmt); 

для получения результата выполнения запроса. Вы должны цикл до возвращаемого значения == SQLITE_ROW

for (i=0; i<4; i++) 
{ 
    rc = sqlite3_prepare_v2(db, "SELECT * from instrumentsdefinition WHERE Type='Magprobe' AND Register=?;", -1, &SQL, 0); 

    rc = sqlite3_bind_int(SQL, 1, i); 

    rc = sqlite3_step(stmt); 

    if (rc == SQLITE_ROW) 
    { 
     // QUERY retrieve a record from DB 
    } 

Последняя вещь, было бы лучше, чтобы изменить имя массива. Не имеет то же имя определенного типа структуры. Что-то вроде Register registers[8];

+0

Спасибо. Я попытался реализовать это, но получить ошибку сегментации в первой строке strncpy(), любые идеи, как я могу это решить? – Mst137

+0

Извините, удалил мой комментарий, когда увидел, что вы добавили больше. Ошибка сегментации на первой строке strncpy. – Mst137

+0

Добавили ли вы также? – LPs