如何从Sqlite查询返回一个通用的Readable对象?

时间:2015-12-14 10:42:33

标签: c# sqlite generics

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

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

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

其中Column1IntColumn2String

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

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

我试图制作如下通用类:

[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 index,   ColType类型,System.Type clrType)[0x00827] in:0
  在SQLite.Net.SQLiteCommand + d__15`1 [T] .MoveNext   ()[0x00137] in:0

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

PS。我在这里的例子已被简化以证明问题

1 个答案:

答案 0 :(得分:0)

所以我的解决方案是将所有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方法