System.Data in Xamarin.iOS

Xamarin.iOS 8.10 bietet Unterstützung für System.Data, einschließlich des Mono.Data.Sqlite.dll ADO.NET-Anbieters. Die Unterstützung umfasst das Hinzufügen der folgenden Assemblys:

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

Beispiel

Das folgende Programm erstellt eine Datenbank in Documents/mydb.db3, und wenn die Datenbank noch nicht vorhanden ist, wird sie mit Beispieldaten aufgefüllt. Die Datenbank wird dann abgefragt, wobei die Ausgabe in stderrgeschrieben wird.

Hinzufügen von Verweisen

Klicken Sie zunächst mit der rechten Maustaste auf den Knoten Verweise, und wählen Sie Verweise bearbeiten... aus, und wählen Sie dann und Mono.Data.SqliteausSystem.Data:

Hinzufügen neuer Verweise

Beispielcode

Der folgende Code zeigt ein einfaches Beispiel für das Erstellen einer Tabelle und das Einfügen von Zeilen mit eingebetteten SQL-Befehlen:

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

Wichtig

Wie im obigen Codebeispiel erwähnt, ist es eine schlechte Methode, Zeichenfolgen in SQL-Befehle einzubetten, da ihr Code dadurch anfällig für SQL-Einschleusung wird.

Verwenden von CommandParameter-Eigenschaften

Der folgende Code zeigt, wie Sie befehlsparameter verwenden, um vom Benutzer eingegebenen Text sicher in die Datenbank einzufügen (auch wenn der Text spezielle SQL-Zeichen wie Single-Apostroph enthält):

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

Fehlende Funktionalität

Sowohl System.Data als auch Mono.Data.Sqlite fehlen einige Funktionen.

System.Data

Funktionen, die inSystem.Data.dll fehlen, bestehen aus:

Mono.Data.Sqlite

In der Zwischenzeit wurdenMono.Data.Sqlite.dll keine Quellcodeänderungen erlitten, sondern können stattdessen für eine Reihe von Laufzeitproblemen gehostet werden, da Mono.Data.Sqlite.dll SQLite 3.5 gebunden wurde. iOS 8 wird in der Zwischenzeit mit SQLite 3.8.5 ausgeliefert. Es genügt zu sagen, dass sich einige Dinge zwischen den beiden Versionen geändert haben.

Ältere Versionen von iOS werden mit den folgenden Versionen von SQLite ausgeliefert:

  • iOS 7 : Version 3.7.13.
  • iOS 6 : Version 3.7.13.
  • iOS 5 : Version 3.7.7.
  • iOS 4 : Version 3.6.22.

Die häufigsten Probleme scheinen sich auf Datenbankschemaabfragen zu beziehen, z. B. das Bestimmen, welche Spalten in einer bestimmten Tabelle vorhanden sind, z Mono.Data.Sqlite.SqliteConnection.GetSchema . B. (Überschreiben von DbConnection.GetSchema und Mono.Data.Sqlite.SqliteDataReader.GetSchemaTable (Außerkraftsetzung von DbDataReader.GetSchemaTable. Kurz gesagt, es scheint, dass alles, was DataTable verwendet, unwahrscheinlich ist.

Datenbindung

Die Datenbindung wird derzeit nicht unterstützt.