System.Data w środowisku Xamarin.iOS

Platforma Xamarin.iOS 8.10 dodaje obsługę pliku System.Data, w tym Mono.Data.Sqlite.dll dostawcę ADO.NET. Obsługa obejmuje dodanie następujących zestawów:

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

Przykład

Poniższy program tworzy bazę danych w programie Documents/mydb.db3, a jeśli baza danych nie istnieje wcześniej, zostanie wypełniona przykładowymi danymi. Następnie jest wysyłana zapytanie do bazy danych z danymi wyjściowymi zapisanymi w pliku stderr.

Dodawanie odwołań

Najpierw kliknij prawym przyciskiem myszy węzeł Odwołania i wybierz polecenie Edytuj odwołania... a następnie wybierz polecenie i Mono.Data.Sqlite:System.Data

Adding new references

Przykładowy kod

Poniższy kod przedstawia prosty przykład tworzenia tabeli i wstawiania wierszy przy użyciu osadzonych poleceń 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]);
    }
}

Ważne

Jak wspomniano w powyższym przykładzie kodu, dobrym rozwiązaniem jest osadzanie ciągów w poleceniach SQL, ponieważ sprawia, że kod jest podatny na wstrzyknięcie kodu SQL.

Używanie parametrów polecenia

Poniższy kod pokazuje, jak bezpiecznie wstawić tekst wprowadzony przez użytkownika do bazy danych przy użyciu parametrów polecenia (nawet jeśli tekst zawiera specjalne znaki SQL, takie jak pojedynczy 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 ();
}

Brak funkcji

Brakuje niektórych funkcji zarówno System.Data , jak i Mono.Data.Sqlite .

System.Data

Brak funkcji w System.Data.dll składa się z następujących elementów:

Mono.Data.Sqlite

W międzyczasie, Mono.Data.Sqlite.dll nie doznał żadnych zmian kodu źródłowego, ale zamiast tego może być hostem do wielu problemów ze środowiskiem uruchomieniowym, ponieważ Mono.Data.Sqlite.dll wiąże SQLite 3.5. Tymczasem system iOS 8 jest dostarczany z funkcją SQLite 3.8.5. Wystarczy powiedzieć, że niektóre rzeczy zmieniły się między dwiema wersjami.

Starsza wersja systemu iOS jest dostarczana z następującymi wersjami biblioteki SQLite:

  • iOS 7 — wersja 3.7.13.
  • iOS 6 — wersja 3.7.13.
  • iOS 5 — wersja 3.7.7.
  • iOS 4 — wersja 3.6.22.

Najbardziej typowe problemy wydają się być związane z wykonywaniem zapytań dotyczących schematu bazy danych, np. określanie w czasie wykonywania, które kolumny istnieją w danej tabeli, takie jak Mono.Data.Sqlite.SqliteConnection.GetSchema (zastępowanie bazy danych Połączenie ion. GetSchema i Mono.Data.Sqlite.SqliteDataReader.GetSchemaTable (przesłanianie tabeli DbDataReader.GetSchemaTable. Krótko mówiąc, wydaje się, że wszystko, co korzysta z usługi DataTable , jest mało prawdopodobne, aby działało.

Powiązanie danych

Powiązanie danych nie jest obecnie obsługiwane.