xamarin.android 的 Sqlite Query<T> 的正确语法

Posted

技术标签:

【中文标题】xamarin.android 的 Sqlite Query<T> 的正确语法【英文标题】:Correct syntax for Sqlite Query<T> for xamarin.android 【发布时间】:2021-05-25 09:46:19 【问题描述】:

如果我想从表Person 中选择一条记录,那么我会这样写查询。

using (var connection = new SQLiteConnection(System.IO.Path.Combine(folder, "Persons.db")))  
  
    connection.Query<Person>("SELECT * FROM Person Where Id=?",Id);  
    return true;  
  

但是如果我想对多个或动态表使用相同的四行呢?我想传递动态表名而不是人。像这样。

void SelectDataForId(string tablename, int id)

    using (var connection = new SQLiteConnection(System.IO.Path.Combine(folder, "Persons.db")))  
                  
        connection.Query<tablename>("SELECT * FROM "+tablename"+ Where Id=" + id);  
        return true;  
    
  

我也尝试过使用 T 的通用类型,但我猜我做错了。

void SelectDataForId<T>(T obj, string tablename, int id)

    using (var connection = new SQLiteConnection(System.IO.Path.Combine(folder, "Persons.db")))  
                
        var type = GetValue<T>(tablename);  
        connection.Query<type>("SELECT * FROM "+tablename"+ Where Id=" + id);  
        return true;  
    
  
public static T GetValue<T>(string value)

    return (T)Convert.ChangeType(value, typeof(T));

请纠正我的错误。

谢谢

【问题讨论】:

请使用参数化查询 - 通过连接等方式构建 SQL 查询是灾难的根源。它不仅是许多难以调试的语法错误的来源,而且还是 SQL Injection attacks 的大门。您的原始查询已经以正确的方式进行,为什么要降级?另外:如果您的代码有问题,最好在提问时描述它们? “我猜我做错了”不是错误描述。 当您使用泛型类型或泛型方法(如List&lt;T&gt;.Query&lt;T&gt;)时,您必须使用编译时类型名称(如List&lt;string&gt;)。您不能使用System.Type 类型的变量。您可以使用 Reflection 的 MakeGenericType (以及等效的方法)来解决这个问题。在这里可能不值得付出努力 @Flydog57,所以我必须检查每个表名与实际表的比较,然后调用这个函数?像这样 ? if(tablename == "Person")using (var connection = new SQLiteConnection(System.IO.Path.Combine(folder, "Persons.db"))) connection.Query&lt;Person&gt;("SELECT * FROM Person Where Id=?",Id); return true; 我有一个 using 语句、一个连接和一个 switch 语句。或者,您可以查看如何使用反射来实现。我之前使用反射设置了这样的东西(例如,从 JSON 文件动态填充表) @Flydog57 你能给我使用反射的示例吗?我已经搜索过它,但没有得到它如何在我的项目中实现。 【参考方案1】:

根据SO post,您不能使用参数作为表名。我们所做的是将表示所需实体记录的类作为泛型类型传递:

// IRecord is the base class for all our DB entity classes
List<T> SelectDataForId<T>(int id) where T : IRecord, new()

    string tableName = typeof(T).Name;
    List<T> list = _connection.Query<T>("SELECT * FROM " + tableName, id);
    return list;

【讨论】:

以上是关于xamarin.android 的 Sqlite Query<T> 的正确语法的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin Android C# SQLite 参数查询

Xamarin.Android(或者Android Studio)用的数据库是Microsoft Access还是SQLite的?

Xamarin android-应用关闭时推送通知单击删除 SQLite 数据

xamarin.android 的 Sqlite Query<T> 的正确语法

Xamarin SQLite教程Xamarin.iOS项目添加引用

Xamarin.Android 使用 SQLite 出现 Index -1 requested, with a size of 10 异常