【发布时间】:2014-10-05 02:40:07
【问题描述】:
目标:自己绑定一个正则表达式函数到 sqlite 数据库,因为 ADO.NET 解决方案在 Windows 通用应用程序上不可用。
edit 实际上,我的真正目标是在 sqlite 数据库上进行单词搜索,但这种骇人听闻的方式并没有返回我需要的结果。
好的,所以我正在尝试为 sqlite 添加到 sqlite-net c# 包装器中。而且......我不知道我在做什么,就像,它值得模因。这是我第一次尝试调用 COM 任何东西。
函数的文档在这里:http://www.sqlite.org/c3ref/create_function.html,但这部分的内容是:第五个参数是任意指针。该函数的实现可以使用 sqlite3_user_data() 访问该指针。
我不认为我想用它做任何事情,我不能传递一个空值。这是我所拥有的:
public void BindRegex(Regex regex)
{
CreateFunction(GetConnection().Handle, "regexp", 1, 2, null, IsMatch, null, null);
}
public Func<string, bool> IsMatch = text => regex.IsMatch(text);
[DllImport("sqlite3.dll", EntryPoint = "sqlite3_create_function", CallingConvention=CallingConvention.Cdecl)]
private static extern int CreateFunction(
IntPtr dbHandle,
string functionName,
int numArgs,
int textEncoding,
IntPtr pApp,
IntPtr xFunc,
IntPtr xStep, // null
IntPtr xFinal // null
);
感谢您对此的帮助。
【问题讨论】:
-
my real objective is to do a word search on the sqlite database您可能正在寻找SQLite full-text-search (FTS) extension -
如果“sqlite-net c# wrapper”是指
System.Data.SQlite,那么它提供SQLiteFunction类供您实现用户定义的函数。 -
无论如何,
sqlite3_create_function的第五个参数可以是NULL。是什么让你不相信? -
我尝试使用 FTS,它对于内部查询来说速度很快,但由于它用于嵌套选择,我的查询时间从 1-2 秒变为 5-8 秒,有时是 13 秒。不幸的是,由于我正在制作一个 Windows 通用应用程序,因此我无权访问 System.Data。至于为什么它不能为空,它可能是一个 VS-being-silly 事情,但它告诉我我不能传入 null。我会再试一次。