无法从SQLite数据库中读取

时间:2016-08-05 10:58:42

标签: c sqlite c-strings

我试图逐行读取数据库。我收到一个警告,指出状态"赋值在没有强制转换的情况下从指针生成整数[默认情况下启用"对于包含sqlite3_column_text()函数的所有行。但是,在我尝试获取整数的行上没有发生此类错误,尽管此行仍然只从数据库返回0.

为了紧凑,删除了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的事实使我相信我的prepare或bind语句也存在错误。

1 个答案:

答案 0 :(得分: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_finalizesqlite3_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];

这样的东西