如何在UWP中的`sqlite-net-pcl`中使用REGEXP

时间:2016-10-27 14:31:02

标签: c# sqlite uwp sqlite-net

我有一个与UWP数据库一起使用的Sqlite项目。我在引用中添加了sqlite-net-pcl。 我想在REGEXP查询中使用select,但它会给我no such function: REGEXP。 我搜索了错误,但结果大约是SQLiteFunction,这里没有定义。 我该怎么办?

3 个答案:

答案 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

nuget中的

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;
}