Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何对WP8 sqlite net进行“原始”查询_C#_Windows Phone 8_Sqlite Net - Fatal编程技术网

C# 如何对WP8 sqlite net进行“原始”查询

C# 如何对WP8 sqlite net进行“原始”查询,c#,windows-phone-8,sqlite-net,C#,Windows Phone 8,Sqlite Net,我正在用sqlite net做WP8。有时我希望在每次都不定义表模型的情况下进行原始查询 我所做的是在下面进行查询,并尝试获取其属性: string query = "SELECT firstname, lastname FROM users"; var records = db.Query<object>(query).ToList(); foreach (var r in records) { System.Diagnostics.Debug

我正在用sqlite net做WP8。有时我希望在每次都不定义表模型的情况下进行原始查询

我所做的是在下面进行查询,并尝试获取其属性:

    string query = "SELECT firstname, lastname FROM users";

    var records = db.Query<object>(query).ToList();
    foreach (var r in records)
     {
 System.Diagnostics.Debug.WriteLine(r.GetType().GetProperty("firstname").GetValue(r,null).toString());
     }
但是,System.NullReferenceException发生异常

我可以知道在不声明表模型的情况下如何实际获取值吗?

简单地说:

string query = "SELECT firstname, lastname FROM users";
Statement stQuery = SQLite3.Prepare2(connection.Handle, query);
while ((SQLite3.Result result = SQLite3.Step(stQuery)) == SQLite3.Result.Row)
{
//your stuff here
}
SQLite3.Finalize(stQuery);

可以通过以下方式扩展分部类:

namespace SQLite
{
public partial class SQLiteConnection 
{
    public List<object[]> CustomQuery(string query, params object[] args)
    {
        var cmd = CreateCommand(query, args);
        return cmd.ExecuteCustomQuery();
    }
}
public partial class SQLiteCommand
{
    public List<object[]> ExecuteCustomQuery()
    {
        if (SQLiteConnection.Trace)
        {
            Debug.WriteLine("Executing Query: " + this);
        }

        var stmt = Prepare();
        try
        {
            var colLenght = SQLite3.ColumnCount(stmt);

            var lstRes = new List<object[]>();
            while (SQLite3.Step(stmt) == SQLite3.Result.Row)
            {
                var obj = new object[colLenght];
                lstRes.Add(obj);
                for (int i = 0; i < colLenght; i++)
                {
                    var colType = SQLite3.ColumnType(stmt, i);
                    switch (colType)
                    {
                        case SQLite3.ColType.Blob:
                            obj[i] = SQLite3.ColumnBlob(stmt, i);
                            break;
                        case SQLite3.ColType.Float:
                            obj[i] = SQLite3.ColumnDouble(stmt, i);
                            break;
                        case SQLite3.ColType.Integer:
                            obj[i] = SQLite3.ColumnInt(stmt, i);
                            break;
                        case SQLite3.ColType.Null:
                            obj[i] = null;
                            break;
                        case SQLite3.ColType.Text:
                            obj[i] = SQLite3.ColumnString(stmt, i);
                            break;
                    }
                }
            }
            return lstRes;
        }
        finally
        {
            SQLite3.Finalize(stmt);
        }
    }
}
}
var query = "select c.Id, c.Name, (select count(*) from Products where IdCategory = c.Id)  from Categories c order by c.Name";
var lst = this.SqlConn.CustomQuery(query);
return (from s in lst
        select new CategoryDescriptor { 
            Id = (int) s[0], 
            Name = (string) s[1], 
            ProductsCount = (int) s[2] 
        });

使用前两个答案第一个答案需要更改源代码,第二个答案不完整

我想出了这个方法:

    public List<object[]> RunSql(string sqlString, bool includeColumnNamesAsFirstRow)
    {
        var lstRes = new List<object[]>();
        SQLitePCL.sqlite3_stmt stQuery = null;
        try
        {
            stQuery = SQLite3.Prepare2(fieldStrikeDatabase.Connection.Handle, sqlString);
            var colLenght = SQLite3.ColumnCount(stQuery);

            if (includeColumnNamesAsFirstRow)
            {
                var obj = new object[colLenght];
                lstRes.Add(obj);
                for (int i = 0; i < colLenght; i++)
                {
                    obj[i] = SQLite3.ColumnName(stQuery, i);
                }
            }

            while (SQLite3.Step(stQuery) == SQLite3.Result.Row)
            {
                var obj = new object[colLenght];
                lstRes.Add(obj);
                for (int i = 0; i < colLenght; i++)
                {
                    var colType = SQLite3.ColumnType(stQuery, i);
                    switch (colType)
                    {
                        case SQLite3.ColType.Blob:
                            obj[i] = SQLite3.ColumnBlob(stQuery, i);
                            break;
                        case SQLite3.ColType.Float:
                            obj[i] = SQLite3.ColumnDouble(stQuery, i);
                            break;
                        case SQLite3.ColType.Integer:
                            obj[i] = SQLite3.ColumnInt(stQuery, i);
                            break;
                        case SQLite3.ColType.Null:
                            obj[i] = null;
                            break;
                        case SQLite3.ColType.Text:
                            obj[i] = SQLite3.ColumnString(stQuery, i);
                            break;
                    }
                }
            }
            return lstRes;
        }
        catch (Exception)
        {
            return null;
        }
        finally
        {
            if (stQuery != null)
            {
                SQLite3.Finalize(stQuery); 
            }
        }
    }

如何获得价值?顺便说一下,上面的代码也包含语法错误。SQLite3。结果值为“完成”。