C# Windows XAML中的SQLite(PCL)查询不允许超过21列?

C# Windows XAML中的SQLite(PCL)查询不允许超过21列?,c#,sqlite,windows-runtime,windows-phone-8.1,nullreferenceexception,C#,Sqlite,Windows Runtime,Windows Phone 8.1,Nullreferenceexception,我已经在我的通用Windows 8.1运行时应用程序中使用了。 在我的项目中有一个包含23列的大表。问题是-虽然表创建和数据插入代码运行时没有任何错误,但在完整列查询中,SELECT*FROM table并没有为我提供超过21列 下面是我的创建表方法,它运行正常: private void CreateTable() { string CREATE_TABLE_SQL = @"CREATE TABLE IF NOT EXISTS "

我已经在我的通用Windows 8.1运行时应用程序中使用了。 在我的项目中有一个包含23列的大表。问题是-虽然表创建和数据插入代码运行时没有任何错误,但在完整列查询中,SELECT*FROM table并没有为我提供超过21列

下面是我的创建表方法,它运行正常:

    private void CreateTable()
    {
        string CREATE_TABLE_SQL = @"CREATE TABLE IF NOT EXISTS "
                + TABLE_NAME
                + "( "
                + KEY_ID + " INTEGER PRIMARY KEY, " // 0
                + KEY_UPDATED_AT + " TEXT, "        // 1
                + KEY_CREATED_AT + " TEXT, "        // 2

            // ... all other column names are stated here in the similar way

                + KEY_LAST_EDITED_BY + " INTEGER, " // 20
                + KEY_LAST_EDIT_TIME + " TEXT, "    // 21
                + KEY_IS_LD + " INTEGER "        // 22
                + ");";
        using (var connection = new SQLiteConnection(DB_NAME))
        {
            using (var statement = connection.Prepare(CREATE_TABLE_SQL))
            {
                statement.Step();
            }
        }
    }
这是我的行插入SQL查询,它运行正常:

string insQuery = 
       @"INSERT INTO " + TABLE_NAME
          + " ( " + KEY_ID + ", " //1
          + KEY_UPDATED_AT + ", "//2
          + KEY_CREATED_AT + " , "//3
          // all other col. names are stated here
          + KEY_LAST_EDITED_BY + ", "//21
          + KEY_LAST_EDIT_TIME + ", "//22
          + KEY_IS_LD + " "//23
          + " ) " 
          + " VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
但是,如果我查询所有行或包含所有列的特定行,则准备好的语句不能超出索引20,因此我假设它包含的列不超过21列。 下面是不运行OK的代码&在访问第21项时给出NullReferenceException:

public List<MyModel> GetAll()
{
    List<MyModel> objList = new List<MyModel>();

    string query = @"SELECT * FROM " + TABLE_NAME
                        + " ORDER BY " + KEY_ID + " DESC;";
    using (var connection = new SQLiteConnection(DB_NAME))
    {
        using (var statement = connection.Prepare(query))
        {
            // The next line prints this: "Statement data-count=0, ColumnCount=23"
            ALog.d("Statement data-count=" + statement.DataCount + 
                    ", ColumnCount=" + statement.ColumnCount); 
            while (statement.Step() == SQLiteResult.ROW)
            {
                try
                {
                    int id = Int32.Parse(statement[0].ToString());
                    string updatedAt = statement[1].ToString();
                    string createdAt = statement[2].ToString();
                    // ... all other values are extracted here, then I'm building
                    //  my user object & the next line prints my expected values
                    ALog.d("User: " + user.ToString());

                    // ... the remaining columns are got here nicely
                    string imgUrl = statement[19].ToString();
                    int lastEdt = Int32.Parse(statement[20].ToString());

                    // This line is the culprit giving out NullReferenceException >_<
                    string lastEdtTm = statement[21].ToString();
                    bool isLd = Int32.Parse(statement[22].ToString()) > 0;

                    objList.Add(new MyModel(
                        // Params. of the constructor goes here ...
                     ));
                }
                catch (Exception e)
                {
                    ALog.d("Db - GetAll() : Exception:: " + e.ToString());
                }
            }

            // This line prints as: "Statement data-count=23, ColumnCount=23"
            // That means - all my data & columns have been queried,
            // but I couldn't read values from statement[21] & statement[22]
                ALog.d("Statement data-count=" + statement.DataCount + 
                        ", ColumnCount=" + statement.ColumnCount);
                statement.Reset();
                statement.ClearBindings();
        }
    }

    return objList;
}

请注意,在这个项目中,我有10多个表,它们的列不到17列&所有这些都运行良好。

问题与以下行有关:

string lastEdtTm = statement[21].ToString();
在这里,如果语句[21]返回null值,则这相当于null.ToString,它将引发异常

简易修复:

string lastEdtTm = statement[21] == null ? "" : statement[21].ToString();
如果语句[21]解析为null,则返回空字符串,否则返回字符串值


请注意,您应该对可能返回null的所有列执行此操作-仅仅因为您现在没有在其他位置获得该异常,并不意味着您以后在添加新行时可能无法获得该异常,这可能会丢失其他值。

您是否检查过语句[21]实际上不包含null值?既然你打了电话,那可能会引起问题。另外,您是否尝试过从第21列开始获取较少数量的列?我只是想澄清问题是否与列数有关,或者与特定列有关…是的-检查为空。。。但这正是我的问题:为什么必须为空?@Kjartan Good point。。。让我尝试获取特定的列。不,这不是我的意思-我的意思是检查返回值是否为null。如果是,则应将语句[21]。ToString替换为语句[21]==null?:语句[21]。ToString。如果值为null,则返回空字符串。实际上,您可以这样做。就是这样:。。。我刚刚得到了特定的column21th值null&表中所有行的值都为null。所以,事实证明,并没有我最初假设的列数限制。谢谢@Kjartan。。。请把你的建议作为答复,以便我能接受。