繁体   English   中英

我是否将SQLite3 C函数正确导入到C#中

[英]Am I Importing a SQLite3 C Function Correctly into C#

我正在尝试在C#中导入SQLite3 C函数,但不确定我是否已正确导入它,即函数参数数据类型正确且函数使用正确吗? 该函数用于将图像数据(.png)插入Sqlite3表中。

这是SQLite网站上的实际C实现:

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

这是我在C#中的导入:

[DllImport("sqlite3", EntryPoint = "sqlite3_bind_blob")]
private static extern int sqlite3_bind_blob (IntPtr stmHandle, int iIndex, string iParam, int iBytes, int iOperation);

C#中SQLite3函数的用法(请注意,该函数返回21 - SQLITE_MISMATCH 20 /* Data type mismatch */ ):

// blob is a byte[]
string query = "INSERT OR REPLACE INTO myTable(lat, lon, image) VALUES({1}, {2}, ?1)";
sqlite3_prepare_v2 (_connection, query, query.Length, out stmHandle, IntPtr.Zero)
int res = sqlite3_bind_blob (stmHandle, 1, blob.ToString(), blob.Length, SQLITE_TRANSIENT);

问题:
-是否已使用正确的参数数据类型正确导入了sqlite3_bind_blob DLL函数?
-我是否正确使用该函数,即是否应该将Blob转换为字符串,并且我是否正确获取Blob(字节数组)的长度?

[DllImport("sqlite3", EntryPoint = "sqlite3_bind_blob", CallingConvention = CallingConvention.Cdecl)]
private static extern int sqlite3_bind_blob (IntPtr stmHandle, int iIndex, byte[] iParam, int iBytes, IntPtr iOperation);

会是更好的签名。 主要是因为System.String是对内部结构未指定的类的引用,所以它甚至不等于wchar_t**

使用正确的导入,调用看起来像

int res = sqlite3_bind_blob (stmHandle, 1, blob, blob.Length, SQLITE_TRANSIENT);

实际上,这正是SQLite .NET包装器所做的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM