我正在使用 Sqlite.Net在我的 Xamarin.Forms
应用程序中。到目前为止,如果我的对象是这样的类,它在返回对象列表方面做得很好:
SqliteDatabase.Connection.Query<Customer>("Select * from Customers");
我现在想从我的查询中动态返回一个 DataSet
的等价物
SqliteDatabase.Connection.Query("Select * from Customers inner join Calls on Customers.Id=Calls.CustomerId")
现在我想从第二个查询返回一个 DataSet
而不是一个对象列表。我知道我可以创建一个新对象,它结合了 Customers
和 Calls
列,但我不想每次查询数据库时都必须创建对象。
是否可以动态返回一个Dataset
或Object
?
最佳答案
最后,我实际上想出了一个方法,该方法将运行任何查询并将行作为列表中的项目返回,而列作为数组中的对象返回:
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 columnType = SQLitePCL.raw.sqlite3_column_decltype(stQuery, i);
switch (columnType)
{
case "text":
obj[i] = SQLite3.ColumnString(stQuery, i);
break;
case "int":
obj[i] = SQLite3.ColumnInt(stQuery, i);
break;
case "real":
obj[i] = SQLite3.ColumnDouble(stQuery, i);
break;
case "blob":
obj[i] = SQLite3.ColumnBlob(stQuery, i);
break;
case "null":
obj[i] = null;
break;
}
}
}
return lstRes;
}
catch (Exception)
{
return null;
}
finally
{
if (stQuery != null)
{
SQLite3.Finalize(stQuery);
}
}
}
关于c# - 是否可以从 Sqlite 查询返回动态对象或数据集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39106298/