2016-08-05 25 views
0

データベースから行単位で読み取ろうとしています。私は、 "代入は、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であるという事実は、私の準備やbindステートメントにもエラーがあると信じさせてくれます。あなたもそれを行うためにポインタを使用することができ、あなたの特定のケースでstrcpy

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

を使用して

+0

Cで配列を割り当てることはできません。文字列の内容をコピーする必要があります。 –

+0

@ CL。どうすればいい? – Mst137

答えて

1

あなたが別の配列を割り当てることができませんを使用して、あなたは先の配列にソース配列の内容をコピーする必要があり、例えば構造体をリファクタリングします。

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

ifを追加しましたか? – LPs

関連する問題