共用方式為


Xamarin.iOS 中的 System.Data

Xamarin.iOS 8.10 新增 System.Data 的支援,包括 Mono.Data.Sqlite.dll ADO.NET 提供者。 支援包括新增下列 元件

  • System.Data.dll
  • System.Data.Service.Client.dll
  • System.Transactions.dll
  • Mono.Data.Tds.dll
  • Mono.Data.Sqlite.dll

範例

下列程式會在 中 Documents/mydb.db3建立資料庫,如果資料庫先前不存在,則會填入範例數據。 接著會查詢資料庫,並將輸出寫入 。stderr

新增參考

首先,以滑鼠右鍵按兩下 [ 參考] 節點,然後選擇 [編輯參考... ],然後選取 System.DataMono.Data.Sqlite

Adding new references

範例程式碼

下列程式代碼示範使用內嵌 SQL 命令建立資料表和插入資料列的簡單範例:

using System;
using System.Data;
using System.IO;
using Mono.Data.Sqlite;

class Demo {
    static void Main (string [] args)
    {
        var connection = GetConnection ();
        using (var cmd = connection.CreateCommand ()) {
            connection.Open ();
            cmd.CommandText = "SELECT * FROM People";
            using (var reader = cmd.ExecuteReader ()) {
                while (reader.Read ()) {
                    Console.Error.Write ("(Row ");
                    Write (reader, 0);
                    for (nint i = 1; i < reader.FieldCount; ++i) {
                        Console.Error.Write(" ");
                        Write (reader, i);
                    }
                    Console.Error.WriteLine(")");
                }
            }
            connection.Close ();
        }
    }

    static SqliteConnection GetConnection()
    {
        var documents = Environment.GetFolderPath (
                Environment.SpecialFolder.Personal);
        string db = Path.Combine (documents, "mydb.db3");
        bool exists = File.Exists (db);
        if (!exists)
            SqliteConnection.CreateFile (db);
        var conn = new SqliteConnection("Data Source=" + db);
        if (!exists) {
            var commands = new[] {
            "CREATE TABLE People (PersonID INTEGER NOT NULL, FirstName ntext, LastName ntext)",
            // WARNING: never insert user-entered data with embedded parameter values
            "INSERT INTO People (PersonID, FirstName, LastName) VALUES (1, 'First', 'Last')",
            "INSERT INTO People (PersonID, FirstName, LastName) VALUES (2, 'Dewey', 'Cheatem')",
            "INSERT INTO People (PersonID, FirstName, LastName) VALUES (3, 'And', 'How')",
            };
            conn.Open ();
            foreach (var cmd in commands) {
                using (var c = conn.CreateCommand()) {
                    c.CommandText = cmd;
                    c.CommandType = CommandType.Text;
                    c.ExecuteNonQuery ();
                }
            }
            conn.Close ();
        }
        return conn;
    }

    static void Write(SqliteDataReader reader, int index)
    {
        Console.Error.Write("({0} '{1}')",
                reader.GetName(index),
                reader [index]);
    }
}

重要

如上述程式代碼範例所述,在 SQL 命令中內嵌字串是錯誤的作法,因為它會使程式代碼容易受到 SQL 插入

使用命令參數

下列程式代碼示範如何使用命令參數安全地將使用者輸入的文字插入資料庫中(即使文字包含特殊 SQL 字元,例如單引號):

// user input from Textbox control
var fname = fnameTextbox.Text;
var lname = lnameTextbox.Text;
// use command parameters to safely insert into database
using (var addCmd = conn.CreateCommand ()) {
    addCmd.CommandText = "INSERT INTO [People] (PersonID, FirstName, LastName) VALUES (@COL1, @COL2, @COL3)";
    addCmd.CommandType = System.Data.CommandType.Text;
    addCmd.AddParameterWithValue ("@COL1", 1);
    addCmd.AddParameterWithValue ("@COL2", fname);
    addCmd.AddParameterWithValue ("@COL3", lname);
    addCmd.ExecuteNonQuery ();
}

遺漏功能

System.DataMono.Data.Sqlite 都缺少一些功能。

System.Data

System.Data.dll遺漏的功能包括:

Mono.Data.Sqlite

同時, Mono.Data.Sqlite.dll 沒有原始碼變更,但可能會裝載許多 運行時間 問題,因為 Mono.Data.Sqlite.dll 系結 SQLite 3.5。 與此同時,iOS 8 隨附 SQLite 3.8.5。 可以說,這兩個版本之間的一些事情已經改變。

舊版的 iOS 隨附於下列 SQLite 版本:

  • iOS 7 - 3.7.13 版。
  • iOS 6 - 3.7.13 版。
  • iOS 5 - 3.7.7 版。
  • iOS 4 - 3.6.22 版。

最常見的問題似乎與資料庫架構查詢有關,例如在運行時間判斷指定數據表上存在哪些數據行,例如 Mono.Data.Sqlite.SqliteConnection.GetSchema (覆寫 Db 連線 ion。GetSchemaMono.Data.Sqlite.SqliteDataReader.GetSchemaTable (覆寫 DbDataReader.GetSchemaTable。 簡言之,使用 DataTable 的任何專案似乎都不太可能運作。

資料繫結

目前不支持數據系結。