【问题标题】:SELECT SQLite.NET records where IDs match int array选择 ID 匹配 int 数组的 SQLite.NET 记录
【发布时间】:2020-03-15 11:15:49
【问题描述】:

我正在使用 SQLite.NET。我正在尝试将整数数组传递给搜索查询。我想返回 ID(表属性)与数组中的整数匹配的记录列表。数组大小为 10。

在 MainPage.cs 中:

int[] arr  = new int[10];
// for testing purposes    
for (int i = 0; i <= 9; i++{
  arr[i] = i;
}

var selected = App.Database.SearchList(arr);

在 SQLiteDatabase.cs 中:

public List<Rooms> SearchList(int[] ID)
{
     return database.Query<Rooms>("SELECT * FROM Rooms WHERE ID = ?;", ID);
}

这会导致执行查询时出现以下错误:

System.NotSupportedException:获取异常详细信息时超时

如何返回 ID 匹配的记录列表?谢谢你。

【问题讨论】:

    标签: c# sqlite xamarin xamarin.forms


    【解决方案1】:

    使用IN 关键字

    WHERE ID IN (1, 2, 3, 4, 5)
    

    【讨论】:

    • 谢谢。我怎样才能做到这一点,以便我可以将数组传递到查询中?我试过这个return database.Query&lt;Rooms&gt;("SELECT * FROM Rooms WHERE ID IN ?;", arr); 但是,这会导致这个错误:SQLite.SQLiteException: near "?": syntax error.
    • 大概是 $"SELECT * FROM Rooms WHERE ID IN ({string.Join(",", arr)})"
    【解决方案2】:

    显然 SQLite.NET 不支持将数组作为参数传递。

    这会抛出异常:

    var IDs = new[] { 1, 2 };
    return database.Query<Rooms>("SELECT * FROM Rooms WHERE ID IN (?);", IDs);
    

    在这种情况下,唯一的解决方案是连接 SQL 字符串中的参数。这适用于 int[],但在使用字符串时应注意 SQL injection

    var IDs = new[] { 1, 2 };
    return database.Query<Rooms>($"SELECT * FROM Rooms WHERE ID IN ({string.Join(",", IDs)});");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多