sqlite3将数据转换为短数组

时间:2013-06-18 16:28:47

标签: c++ c sqlite type-conversion

我在使用Modbus的嵌入式系统上使用sqlite3。我需要将sqlite3的select语句结果中的信息打包成一个short数组,以便能够通过Modbus。

目前,我只使用sqlite3(TEXT和INT)中的2种数据类型。我试图将每列结果的结果打包成一组短裤。例如:

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);

我正在考虑创建从unsigned char *(sqlite3_column_text的结果)转换为short数组和int转换为short数组的函数。这是怎么回事?或者是否有正确的方法来动态投射这些结果?

另外,考虑使结构与sqlite3表类型匹配以便于复制,然后最后,有一个函数来遍历每个结构成员并在最后将它转换为一个short数组。

编辑:我刚刚读到结构中的联盟,我认为这正是我需要的:

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

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

它说,现在他们都看同一块记忆,但可以用不同的方式阅读,这就是我想要的。这比任何一种转换要容易得多吗?

1 个答案:

答案 0 :(得分:0)

sqlite不会自动为您提供这些转化。您必须自己进行转换。

我只会使用纯文本访问,然后编写免费函数来转换对short的访问。像这样的东西,不确定界面会对你的访问最有意义。

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

也许你的用例已经将它们放在短裤阵列中?如果实际上你是如何使用这些数据的话,我可能仍然只会为每个字段做一个简短。

就个人而言,如果你能提供帮助,我会把它们作为整数放入数据库。您必须编写特殊工具才能查看数据库值,这对于维护来说并不十分友好。