我正在尝试用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);
?
答案 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);
}
无论如何,除非您确定需要这些内容,否则我建议您继续使用托管system.data.sqlite并放弃SQLite3 CAPI。