System.Data in Xamarin.iOS

Xamarin.iOS 8.10 aggiunge il supporto per System.Data, incluso il Mono.Data.Sqlite.dll provider ADO.NET. Il supporto include l'aggiunta degli assembly seguenti:

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

Esempio

Il programma seguente crea un database in Documents/mydb.db3e, se il database non esiste in precedenza, viene popolato con dati di esempio. Il database viene quindi sottoposto a query, con l'output scritto in stderr.

Aggiungere riferimenti

Fare prima clic con il pulsante destro del mouse sul nodo Riferimenti e scegliere Modifica riferimenti, quindi selezionare System.Data e Mono.Data.Sqlite:

Adding new references

Codice di esempio

Il codice seguente illustra un semplice esempio di creazione di una tabella e inserimento di righe usando comandi SQL incorporati:

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

Importante

Come accennato nell'esempio di codice precedente, è consigliabile incorporare stringhe nei comandi SQL perché rende il codice vulnerabile all'inserimento DI SQL.

Uso di parametri di comando

Il codice seguente illustra come usare i parametri di comando per inserire testo immesso dall'utente in modo sicuro nel database (anche se il testo contiene caratteri SQL speciali come apostrofo singolo):

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

Funzionalità mancanti

Sia System.Data che Mono.Data.Sqlite mancano alcune funzionalità.

System.Data

La funzionalità mancante da System.Data.dll è costituita da:

Mono.Data.Sqlite

Nel frattempo, Mono.Data.Sqlite.dll non ha subito modifiche al codice sorgente, ma potrebbe invece essere host di diversi problemi di runtime , perché Mono.Data.Sqlite.dll associa SQLite 3.5. iOS 8, nel frattempo, viene fornito con SQLite 3.8.5. Basta dire, alcune cose sono cambiate tra le due versioni.

La versione precedente di iOS è disponibile con le versioni seguenti di SQLite:

  • iOS 7 - versione 3.7.13.
  • iOS 6 - versione 3.7.13.
  • iOS 5 - versione 3.7.7.
  • iOS 4 - versione 3.6.22.

I problemi più comuni sembrano essere correlati all'esecuzione di query sullo schema del database, ad esempio determinare in fase di esecuzione quali colonne esistono in una determinata tabella, ad esempio Mono.Data.Sqlite.SqliteConnection.GetSchema (override di Db Connessione ion. GetSchema e Mono.Data.Sqlite.SqliteDataReader.GetSchemaTable (override di DbDataReader.GetSchemaTable. In breve, sembra che qualsiasi elemento che usa DataTable non funzioni correttamente.

Data Binding

Il data binding non è attualmente supportato.