将图像写入SQLite数据库始终失败

时间:2013-11-25 00:36:06

标签: sqlite c++-cli

我正在尝试用C#编写一个png到SQLite3数据库。由于answer here,我已设法正确导入外部DLL函数sqlite3_bind_blob。但是现在我在将图像写入SQLite3数据库时遇到错误。

你能告诉我我做错了什么吗?函数函数sqlite3_bind_blob返回错误21 - SQLITE_MISMATCH 20 - Data type mismatch。我不确定到底出了什么问题。

继承我的代码:

string query = string.Format("INSERT OR REPLACE INTO myTable(lat, lon, image) VALUES({0}, {1}, ?1);", lat, lon);

if (sqlite3_prepare_v2 (_connection, query, query.Length, out stmHandle, IntPtr.Zero) != SQLITE_OK) {
    IntPtr errorMsg = sqlite3_errmsg (_connection);
    throw new SqliteException (Marshal.PtrToStringAnsi (errorMsg));
}

IntPtr SQLITE_TRANSIENT = new IntPtr(-1); // Represents SQLITE_TRANSIENT
int res = sqlite3_bind_blob (stmHandle, 1, blob, blob.Length, SQLITE_TRANSIENT);

// res always equals 21

从我的调试中我知道blob正确包含有效的png数据,因为我可以将其写入文件并打开该文件。我也知道blob的长度也是正确的。也许是我的查询字符串INSERT OR REPLACE INTO myTable(lat, lon, image) VALUES({0}, {1}, ?1);

1 个答案:

答案 0 :(得分:0)

您正在使用非托管代码进行管理。

int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));

您提供的是托管IntPtr blob而不是非托管const void*blob

在使用非托管代码进行混合管理时,您应该非常确定自己正在做什么 - 并且它不是你的...

你可以使用以下方法解决这种情况(我现在没有编译器):

unsafe { //this is for C#... probably not needed in C++/CLI
    int res = sqlite3_bind_blob (stmHandle, 1, (const void*) blob.ToPointer(), (int) blob.Length, SQLITE_TRANSIENT);
}

无论如何,除非您确定需要这些内容,否则我建议您继续使用托管并放弃SQLite3 CAPI