我google了很多,找不到任何解决方案。我现在正在给自己写一篇文章 Codegear 2007 C ++中的应用程序。我正在为我的小小猫写这个应用程序,它有点'乳制品 但我称之为KittyBook。
所以我有两张桌子(抱歉不明白CodeBlock如何):
KittenInfo存储他们的名字和他们的ID(主键),他们的性别和他们的出生。这个有效。
另一个应该存储一个Blob。在尝试了这么多方法之后。如果我使用普通插入执行查询但不包括blob表,它将不会存储在表中,甚至不存储在其他数据中。
所以,我不知道我做错了什么但我到目前为止爱SQLite。没有回头呃?
功能是:
void CDatabase::InsertKittenData(int Kitten_ID, int kittenDay, bool DayOrWeek,
char * kitten_weight, char * Kitten_Comment, string PhotoFile) {
unsigned char * blob;
ifstream::pos_type size;
int size2 = 0;
if (FileExists(PhotoFile.c_str())) {
ifstream file(PhotoFile.c_str(), ios::in | ios::binary | ios::ate);
if (file.is_open()) {
size = file.tellg();
blob = new char[size];
file.seekg(0, ios::beg);
file.read(blob, size);
file.close();
}
}
else {
blob = NULL;
}
sqlite3 *dbp;
sqlite3_stmt *ppStmt;
// NULL = primary key autoinc.
char * Sql = "INSERT INTO KittenData VALUES ( NULL, ? , ? ,? , ? , ? , ?);";
int rc = sqlite3_open("KittyBook.db", &dbp);
if (rc)
return;
if (sqlite3_prepare_v2(dbp, Sql, -1, &ppStmt, NULL) != SQLITE_OK) {
return;
}
if (ppStmt) {
if (sqlite3_bind_int(ppStmt, 1, Kitten_ID) != SQLITE_OK)
return;
if (sqlite3_bind_int(ppStmt, 2, kittenDay) != SQLITE_OK)
return;
if (sqlite3_bind_int(ppStmt, 3, DayOrWeek) != SQLITE_OK)
return;
if (sqlite3_bind_text(ppStmt, 4, // Index of wildcard
kitten_weight, strlen(kitten_weight), // length of text
SQLITE_STATIC) != SQLITE_OK)
return;
if (sqlite3_bind_text(ppStmt, 5, // Index of wildcard
Kitten_Comment, strlen(Kitten_Comment), // length of text
SQLITE_STATIC) != SQLITE_OK)
return;
if (sqlite3_bind_blob(ppStmt, 6, blob, size2, SQLITE_TRANSIENT)
!= SQLITE_OK)
return;
if (sqlite3_step(ppStmt) != SQLITE_DONE)
return;
}
sqlite3_finalize(ppStmt);
sqlite3_exec(dbp, "COMMIT", NULL, NULL, NULL);
sqlite3_close(dbp);
}
答案 0 :(得分:0)
您将size2
声明并初始化为零:
int size2 = 0;
然后下一次使用size2
就是绑定blob:
sqlite3_bind_blob(ppStmt, 6, blob, size2, SQLITE_TRANSIENT)
来自fine manual:
在具有第四个参数的那些例程中,其值是参数中的字节数。需要明确的是:值是值中的字节数,而不是字符数。
并且在这种情况下的第四个参数是size2
并且该零为零。结果是你告诉SQLite绑定一个零长度的blob,然后你就会想知道为什么没有存储。好吧,没有任何东西可以存储,因为你要求SQLite存储零字节,它只是按照它所说的去做。
也许您想使用size
代替size2
。
答案 1 :(得分:0)
mu太短了,给了我一步一步完成功能并增加列的想法 按列。不知道我做错了什么,但现在正在努力。
干杯太短了:))