2013-06-18 99 views
0

我在帶有Modbus的嵌入式系統上使用sqlite3。我需要將來自sqlite3的select語句結果的信息打包成一個短陣列,以便能夠通過Modbus。sqlite3將數據轉換爲短陣列

目前,我只使用來自sqlite3(TEXT和INT)的兩種數據類型。我試圖將每列結果的結果打包成一組短褲。例如:

typedef struct 
{ 
    short unitSN[4]; 
    short unitClass[1]; 
}UnitSettings; 

UnitSettings unitSettings; 

// prepare and execute select statement for table, then put into structs members 
s = sqlite3_prepare(db, sqlstmt, strlen(sqlstmt), &stmt, &pzTest); 
s = sqlite3_step(stmt); 

// I want to do something like this: 
unitSettings.unitSN[] = sqlite3_column_text(stmt, 0); 
unitSettings.unitClass[] = sqlite3_column_int(stmt, 1); 

我考慮創建函數從無符號字符*(sqlite3_column_text的結果),以短陣和INT到短數組轉換。這是要走的路嗎?或者是否有正確的方法來即時投射這些結果?

此外,正在考慮使結構與sqlite3表類型相匹配,以便於複製,然後在最後有一個函數來運行每個結構成員,並在最後將其轉換爲一個shorts數組。

編輯:我剛剛看了一下結構中的工會,我認爲這將是正是我需要的:

typedef struct 
{ 
    union 
    { 
     unsigned char* unitSN; 
     short unitSNArr[4]; 
    } 

    union 
    { 
     int unitClass; 
     short unitClassArr[1]; 
    } 
}UnitSettings; 

它說,現在他們都看同一塊內存,但可以讀取它以不同的方式,這是我想要的。這比任何類型的轉換都容易得多?

+0

現在決定......你有「短」還是「弦」? – 2013-06-18 16:33:41

回答

0

sqlite不會爲您自動提供這些轉換。你必須自己做轉換。

我只是使用純文本訪問,然後編寫免費功能來翻譯訪問權限。像這樣的事情,不確定接口會根據您的訪問情況最有意義。

void read_short(const char* data, size_t index, short& val) { 
    val = *(reintepret_cast<short*>(&data[index*2])); 
} 

也許你的用例已經有他們在短褲或什麼的數組?如果這實際上是您使用數據的方式,那麼我可能仍然只會爲每個字段執行一次短的操作。

就我個人而言,如果可以幫忙的話,我會將它們作爲整數放入數據庫中。你必須編寫專門的工具來查看數據庫值,這對於維護來說並不是很友好。