System.Data v Xamarin.iOS

Xamarin.iOS 8.10 přidává podporu pro System.Data, včetně Mono.Data.Sqlite.dll poskytovatele ADO.NET. Podpora zahrnuje přidání následujících sestavení:

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

Příklad

Následující program vytvoří databázi v Documents/mydb.db3databázi a pokud databáze dříve neexistuje, naplní se ukázkovými daty. Databáze se pak dotazuje s výstupem zapsaným do stderr.

Přidat odkazy

Nejprve klikněte pravým tlačítkem myši na uzel Odkazy a zvolte Upravit odkazy... a pak vyberte System.Data a Mono.Data.Sqlite:

Adding new references

Ukázka kódu

Následující kód ukazuje jednoduchý příklad vytvoření tabulky a vložení řádků pomocí vložených příkazů 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]);
    }
}

Důležité

Jak je uvedeno v ukázce kódu výše, je vhodné vkládat řetězce do příkazů SQL, protože je váš kód zranitelný vůči injektáži SQL.

Použití parametrů příkazu

Následující kód ukazuje, jak pomocí parametrů příkazu bezpečně vložit uživatelem zadaný text do databáze (i když text obsahuje speciální znaky SQL, jako je single-apostrof):

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

Chybějící funkce

Chybí některé funkce System.Data i Mono.Data.Sqlite .

System.Data

V System.Data.dll chybí funkce:

Mono.Data.Sqlite

Mezitím Mono.Data.Sqlite.dll žádné změny zdrojového kódu, ale místo toho může být hostitelem řady problémů za běhu, protože Mono.Data.Sqlite.dll sváže SQLite 3.5. iOS 8 mezitím dodává s SQLite 3.8.5. Stačí říct, že se mezi těmito dvěma verzemi změnily některé věci.

Starší verze iOS se dodává s následujícími verzemi SQLite:

  • iOS 7 – verze 3.7.13.
  • iOS 6 – verze 3.7.13.
  • iOS 5 – verze 3.7.7.
  • iOS 4 – verze 3.6.22.

Nejběžnější problémy se jeví jako související s dotazováním schématu databáze, například určením za běhu, které sloupce existují v dané tabulce, například Mono.Data.Sqlite.SqliteConnection.GetSchema (přepsání databáze Připojení ionu). GetSchema a Mono.Data.Sqlite.SqliteDataReader.GetSchemaTable (přepsání DbDataReader.GetSchemaTable. Stručně řečeno, zdá se, že cokoli, co používá DataTable , pravděpodobně nebude fungovat.

Datová vazba

Datová vazba se v tuto chvíli nepodporuje.