无法从 SQLite 数据库读取
Unable to read from SQLite database
我正在尝试逐行读取数据库。我收到一条警告,指出包含 sqlite3_column_text() 函数的所有行都为 "assignment makes integer from pointer without a cast [enabled by default"。然而,在我尝试获取整数的行上没有发生这样的错误,尽管这一行仍然只有 returns 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;
}
我知道这个错误与字符数组和字符有关,但是我已经尝试了很多方法来解决这个问题。此外,返回的 int 始终为 0 的事实让我相信我的 prepare 或 bind 语句也有错误。
使用c you cannot assign an array to another, you have to copy source array content to destination array, eg using 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
,return 来自 sqlite3_column_tex
的值变得无效。
另一件事是查询执行,绑定后必须调用
rc = sqlite3_step(stmt);
检索查询执行的结果。您应该循环直到 returned 值为 == 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];
我正在尝试逐行读取数据库。我收到一条警告,指出包含 sqlite3_column_text() 函数的所有行都为 "assignment makes integer from pointer without a cast [enabled by default"。然而,在我尝试获取整数的行上没有发生这样的错误,尽管这一行仍然只有 returns 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;
}
我知道这个错误与字符数组和字符有关,但是我已经尝试了很多方法来解决这个问题。此外,返回的 int 始终为 0 的事实让我相信我的 prepare 或 bind 语句也有错误。
使用c you cannot assign an array to another, you have to copy source array content to destination array, eg using 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
,return 来自 sqlite3_column_tex
的值变得无效。
另一件事是查询执行,绑定后必须调用
rc = sqlite3_step(stmt);
检索查询执行的结果。您应该循环直到 returned 值为 == 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];