2016-08-23 72 views
0

我在我的Xamarin.Forms應用程序中使用Sqlite.Net。到目前爲止,它已經在返回對象的名單已經很大,如果我的目標是像這樣一類:是否可以從Sqlite查詢中返回動態對象或數據集?

SqliteDatabase.Connection.Query<Customer>("Select * from Customers"); 

現在我想從我的查詢返回動態地DataSet相當於

SqliteDatabase.Connection.Query("Select * from Customers inner join Calls on Customers.Id=Calls.CustomerId") 

現在從第二個查詢中,我想返回一個DataSet而不是一個對象列表。我知道我可以創建一個新的對象,它將CustomersCalls的列組合起來,但我不想每次要查詢數據庫時都必須創建對象。

是否可以動態返回DatasetObject

+0

什麼問題,你的問候返回'DataSet或DataTable'這是不是很困難的經歷..提示做就.fill僞'()'方法谷歌搜索。有很多關於如何在stackoverflow上執行此操作的示例.. – MethodMan

+0

@MethodMan您確定我們正在討論相同的Sqlite包裝?我正在使用的'Sqlite.Net-PCL'上不存在'Fill'方法 – user1

回答

0

在我實際上設法想出將運行任何查詢,並在列表項返回行的方法結束並將列作爲數組中的對象:

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

SQLite.NET PCL是一個圍繞sqlite的.NET包裝。

因此,您可以通過在LINQ或Lambda中使用聯接而不是在查詢中查詢類似於EF的查詢。包裝器將爲您處理轉換爲sqlite查詢。

然後,您可以返回連接類型或動態類型的新數據類型。

注意:連接不直接支持在sqlite(more info)和變通提到here

示例代碼:

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

LAMBDA版本:

conn.Table<Customer>().ToList().Join 
(conn.Table<Call>().ToList(), 
customer => customer.Id, 
call => call.CustomerId, 
(customer, call) => new { Customer = customer, Calls = call }); 
+0

你有這樣的例子嗎?我可以試試嗎? – user1

+0

謝謝你的例子,但不幸的是它不起作用。你會得到一個'System.NotSupportedException:不支持連接。'是否有其他庫或代碼可以嘗試? – user1

+1

多數民衆贊成,這是有效的!如果我用'LINQ'完成相同的操作,我會更新答案 – user1

0

非常感謝你user1!作品完美。 這裏僅僅是一個例子,如何使用烏爾法:

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]); 
    } 
} 
0

這聽起來像你想要做的基本上是重新創建ADO.NET什麼。當你說「DataSet」時,我猜你正在談論ADO.NET。這可能意味着您不想使用內置於SQLite.Net庫的ORM功能。

我已經創建了這個版本的庫,允許你從SQLite數據庫進行平表讀取。這意味着如果您願意,您可以將數據讀入ADO.NET數據集。

https://github.com/MelbourneDeveloper/SQLite.Net.Standard

相關問題