System.Data di Xamarin.iOS

Xamarin.iOS 8.10 menambahkan dukungan untuk System.Data, termasuk Mono.Data.Sqlite.dll penyedia ADO.NET. Dukungan mencakup penambahan rakitan berikut:

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

Contoh

Program berikut membuat database di Documents/mydb.db3, dan jika database sebelumnya tidak ada, itu diisi dengan data sampel. Database kemudian dikueri, dengan output yang ditulis ke stderr.

Tambahkan Referensi

Pertama, klik kanan pada node Referensi dan pilih Edit Referensi... lalu pilih System.Data dan Mono.Data.Sqlite:

Adding new references

Kode Sampel

Kode berikut menunjukkan contoh sederhana membuat tabel dan menyisipkan baris menggunakan perintah SQL yang disematkan:

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

Penting

Seperti disebutkan dalam sampel kode di atas, adalah praktik buruk untuk menyematkan string dalam perintah SQL karena membuat kode Anda rentan terhadap injeksi SQL.

Menggunakan Parameter Perintah

Kode berikut menunjukkan cara menggunakan parameter perintah untuk menyisipkan teks yang dimasukkan pengguna dengan aman ke dalam database (bahkan jika teks berisi karakter SQL khusus seperti apostrof tunggal):

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

Fungsionalitas Hilang

System.Data dan Mono.Data.Sqlite kehilangan beberapa fungsionalitas.

System.Data

Fungsionalitas yang hilang dari System.Data.dll terdiri dari:

Mono.Data.Sqlite

Sementara itu, Mono.Data.Sqlite.dll tidak mengalami perubahan kode sumber, tetapi mungkin menjadi host untuk sejumlah masalah runtime sejak Mono.Data.Sqlite.dll mengikat SQLite 3.5. iOS 8, sementara itu, dikirim dengan SQLite 3.8.5. Cukup untuk mengatakannya, beberapa hal telah berubah di antara dua versi.

Versi lama iOS dikirim dengan versi SQLite berikut:

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

Masalah yang paling umum tampaknya terkait dengan kueri skema database, misalnya menentukan pada runtime mana kolom yang ada pada tabel tertentu, seperti Mono.Data.Sqlite.SqliteConnection.GetSchema (menimpa Db Koneksi ion. GetSchema dan Mono.Data.Sqlite.SqliteDataReader.GetSchemaTable (menimpa DbDataReader.GetSchemaTable. Singkatnya, tampaknya apa pun yang menggunakan DataTable tidak mungkin berfungsi.

Pengikatan Data

Pengikatan Data saat ini tidak didukung.