visual studio para how example ejemplo datos create conexion c# sqlite windows-runtime windows-phone-8.1 nullreferenceexception

c# - studio - Consulta de SQLite(PCL) en Windows XAML que no permite más de 21 columnas?



xamarin forms sqlite example (1)

El problema está relacionado con líneas como esta:

string lastEdtTm = statement[21].ToString();

Aquí, si la statement[21] devuelve un valor null , entonces eso es equivalente a null.ToString() , que emitirá una excepción.

Solución fácil:

string lastEdtTm = statement[21] == null ? "" : statement[21].ToString();

Esto devolverá una cadena vacía si la statement[21] resuelve null , o es el valor de cadena de lo contrario.

Tenga en cuenta que debe hacer esto para todas las columnas que potencialmente pueden devolver nulo ; simplemente porque no está obteniendo esa excepción en otros lugares ahora, no significa que no podrá obtenerla más tarde cuando se agreguen nuevas filas, que pueden estar perdiendo otros valores .

Utilicé SQLite-PCL en mi aplicación Universal Windows 8.1 RunTime.
Hay una gran mesa con 23 columnas en mi proyecto. El problema es que, aunque los códigos de creación de tabla e inserción de datos se ejecutan sin ningún error, pero en la consulta de columna completa (SELECT * FROM table) no me da más de 21 columnas.

Aquí está mi método create-table (funciona bien):

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(); } } }

Aquí está mi consulta SQL de inserción de fila (también se ejecuta OK):

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(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";

Pero si consulto todas las filas o una fila específica con todas las columnas, la declaración preparada no puede ir más allá del índice 20, por lo tanto, supongo que no contiene más de 21 columnas dentro de ella. Aquí está el código que no se ejecuta bien y da NullReferenceException durante el acceso del 21 ° elemento:

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; }

Tenga en cuenta que tengo más de 10 tablas en el proyecto con menos de 17 columnas y todas funcionan bien.