2016-08-05 135 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的事實使我相信我的準備或綁定語句也存在錯誤。

+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返回t值變爲無效。


另一件事是查詢執行,綁定後,必須調用

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