c# - llenar - xamarin forms sqlite example
¿Es posible devolver objetos dinámicos o Dataset desde una consulta Sqlite? (4)
Estoy usando Sqlite.Net en mi aplicación Xamarin.Forms
. Hasta ahora ha sido genial devolver listas de objetos si mi objeto es una clase como esta:
SqliteDatabase.Connection.Query<Customer>("Select * from Customers");
Ahora me gustaría devolver el equivalente de un DataSet
dinámicamente de mi consulta
SqliteDatabase.Connection.Query("Select * from Customers inner join Calls on Customers.Id=Calls.CustomerId")
Ahora, desde la segunda consulta, me gustaría devolver un DataSet
lugar de una lista de objetos. Sé que podría crear un nuevo objeto que combine las columnas de Customers
y Calls
pero no quiero tener que crear objetos cada vez que quiera consultar la base de datos.
¿Es posible devolver dinámicamente un Dataset
u Object
?
Al final logré encontrar un método que ejecutará cualquier consulta y devolverá las filas como elementos en la lista y las columnas como objetos en la matriz:
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);
}
}
}
SQLite.NET PCL es un contenedor .NET alrededor de sqlite.
Por lo tanto, puede realizar consultas similares a EF utilizando una combinación en LINQ o Lambda que en la consulta. El contenedor manejará la conversión a la consulta sqlite por usted.
A continuación, puede devolver un nuevo tipo de datos del tipo unido o dinámico.
Nota : las uniones no se admiten directamente en sqlite ( más información ) y se menciona aquí .
Código de muestra :
var conn = new SQLiteConnection(sqlitePlatform, "foofoo");
var query = from customer in conn.Table<Customers>().ToList()
join call in conn.Table<Calls>().ToList()
on customer.ID equals call.CustomerId
select new { Customer = customer , Calls = call };
Versión Lambda:
conn.Table<Customer>().ToList().Join
(conn.Table<Call>().ToList(),
customer => customer.Id,
call => call.CustomerId,
(customer, call) => new { Customer = customer, Calls = call });
muchas gracias user1! funciona perfecto aquí hay solo un ejemplo de cómo usar tu método:
var objects = mySQLiteConnection.RunSql("SELECT * FROM Persons", true);
// ColumnNames
List<string> ColumnNames = new List<string>();
for (int column = 0; column < objects[0].Length; column++)
{
if (objects[0][column] != null) spaltennamen.Add((string)objects[0][column]);
}
// RowValues
for (int row = 1; row < objects.Count; row++)
{
for (int column = 0; column < objects[row].Length; column++)
{
if (objects[row][column] != null) System.Diagnostics.Debug.WriteLine(spaltennamen[column] + " : " + objects[row][column]);
}
}
Parece que lo que quieres hacer es esencialmente recrear ADO.NET. Cuando dices "DataSet", supongo que estás hablando de ADO.NET. Esto probablemente significa que no desea utilizar la funcionalidad ORM integrada en la biblioteca SQLite.Net.
Creé esta versión de la biblioteca que le permitirá realizar lecturas de tablas planas desde una base de datos SQLite. Significa que PUEDE leer los datos en un conjunto de datos ADO.NET si lo desea.