【问题标题】:How do I return a generic Readable object from a Sqlite Query? [duplicate]如何从 Sqlite 查询返回通用可读对象? [复制]
【发布时间】:2015-12-14 10:42:32
【问题描述】:

我正在使用查询来查询我的 Sqlite 数据库,如下所示:

string noteSql = "select Column1, Column2 from [Diary.Notes]"

var notes = database.Query<object>(noteSql) as List<Object>;

其中Column1IntColumn2String

但是当我的列表 notes 返回时,对象是不可读的。

我知道我可以创建一个具有 IntString 类型的两个属性的对象,这适用于从 [DiaryNotes] 返回的两个列,但我想要一个更通用的解决方案。

我试图创建一个如下的通用类:

[Table("Table1")]
public class GenericSqliteObject : Object
{
    public GenericSqliteObject()
    {

    }

    private object _column1;
    [Column("Column1")]
    public object Column1
    {
        get { return _column1; }
        set { _column1 = value; }
    }


    private object _column2;
    [Column("Column2")]
    public object Column2
    {
        get { return _column2; }
        set { _column2 = value; }
    }

}

但将行改为:

var notes = database.Query<GenericSqliteObject>(noteSql) as List<GenericSqliteObject>;

不断返回错误:

{System.NotSupportedException: 不知道如何读取 System.Object
在 SQLite.Net.SQLiteCommand.ReadCol(IDbStatement stmt,Int32 索引, ColType 类型,System.Type clrType) [0x00827] in :0
在 SQLite.Net.SQLiteCommand+d__15`1[T].MoveNext () [0x00137] 在 :0

有没有办法从 Sqlite 查询返回一个通用对象,这样我就不必为不同的用例创建对象?

PS。我这里的示例已被简化以演示问题

【问题讨论】:

    标签: c# sqlite generics


    【解决方案1】:

    所以我的解决方案是将所有 Column 值保存为字符串并在运行时解析它们。

    因此我的GenericSqliteObject 如下所示:

    namespace FieldStrikeMove.PortableData.Helpers
    {
        [Table("Table1")]
        public class GenericSqliteObject : Object
        {
            public GenericSqliteObject()
            {
    
            }
    
            private string _column1;
            [Column("Column1")]
            public string Column1
            {
                get { return _column1; }
                set { _column1 = value; }
            }
    
    
            private string _column2;
            [Column("Column2")]
            public string Column2
            {
                get { return _column2; }
                set { _column2 = value; }
            }
    
    
            public int? GetInt(string column)
            {
                int rint;
    
                if (Int32.TryParse(column, out rint))
                    return rint;
                else
                    return null;
            }
    
            public long? GetLong(string column)
            {
                long rlong;
    
                if (Int64.TryParse(column, out rlong))
                    return rlong;
                else
                    return null;
            }
    
            public bool? GetBool(string column)
            {
                bool rbool;
    
                if (Boolean.TryParse(column, out rbool))
                    return rbool;
                else
                    return null;
            }
            public double? GetDouble(string column)
            {
                double rdouble;
    
                if (Double.TryParse(column, out rdouble))
                    return rdouble;
                else
                    return null;
            }
            public float? GetFloat(string column)
            {
                float rfloat;
    
                if (float.TryParse(column, out rfloat))
                    return rfloat;
                else
                    return null;
            }
        }
    }
    

    你可以添加任何额外的 Get 方法到这个你需要的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 2021-09-14
      • 2019-10-13
      相关资源
      最近更新 更多