我有一个与UWP
数据库一起使用的Sqlite
项目。我在引用中添加了sqlite-net-pcl
。
我想在REGEXP
查询中使用select
,但它会给我no such function: REGEXP
。
我搜索了错误,但结果大约是SQLiteFunction
,这里没有定义。
我该怎么办?
答案 0 :(得分:1)
参考The LIKE, GLOB, REGEXP, and MATCH operators:
REGEXP运算符是regexp()用户函数的特殊语法。默认情况下没有定义regexp()用户函数,因此使用REGEXP运算符通常会导致错误消息。如果在运行时添加名为“regexp”的application-defined SQL function,则“X REGEXP Y”运算符将实现为对“regexp(Y,X)”的调用。
因此,要使用REGEXP,我们需要能够创建用户定义的函数。 SQLiteFunction是专门用于在System.Data.SQLite中处理用户定义函数的类。但是,System.Data.SQLite是SQLite的ADO.NET提供程序,无法在UWP应用程序中使用。
在SQLite-net PCL中,没有这样的方法。但是,SQLite-net PCL使用下面的SQLitePCL.raw,这是一个围绕Cite for SQLite的非常薄的C#包装器,并提供对SQLite的低级(原始)访问。使用SQLitePCL.raw,我们可以像@ Maryam的回答一样创建用户定义的函数。
答案 1 :(得分:1)
最后,我从sqlite-net-pcl
安装了nuget
而不是ReferenceManger中Universal windows extensions
中的sqlite-net-pcl
。
sqlite3_create_function
包具有SQLiteConnection con = new SQLiteConnection(@"myDB.db");
SQLitePCL.raw.sqlite3_create_function(con.Handle, "REGEXP", 2, null, MatchRegex);
private void MatchRegex(sqlite3_context ctx, object user_data, sqlite3_value[] args)
{
bool isMatched = System.Text.RegularExpressions.Regex.IsMatch(SQLitePCL.raw.sqlite3_value_text(args[1]), SQLitePCL.raw.sqlite3_value_text(args[0]),RegexOptions.IgnoreCase);
if (isMatched)
SQLitePCL.raw.sqlite3_result_int(ctx, 1);
else
SQLitePCL.raw.sqlite3_result_int(ctx, 0);
}
方法。
try {$data = [xml] $str } catch {}
这很好用:))
答案 2 :(得分:0)
如果您可以使用类似SQLite PCL Pretty的东西,您可以执行以下操作(可能与其他PCL一起使用,但不确定):
if (Datagrid1.SelectedIndex != -1 && Datagrid1.SelectedIndex != 0)
{
DataTable dt = ((DataView)Datagrid1.ItemsSource).ToTable();
int index = Datagrid1.SelectedIndex;
DataRow selectedRow = dt.Rows[index];
DataRow newRow = dt.NewRow();
newRow.ItemArray = selectedRow.ItemArray;
dt.Rows.Remove(selectedRow);
dt.Rows.InsertAt(newRow, index - 1);
Datagrid1.ItemsSource = dt.DefaultView;
Datagrid1.SelectedIndex = index - 1;
}