Xamarin.iOS'ta System.Data

Xamarin.iOS 8.10, ADO.NET sağlayıcısı da dahil olmak üzere Mono.Data.Sqlite.dll System.Data için destek ekler. Destek, aşağıdaki derlemelerin eklenmesini içerir:

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

Örnek

Aşağıdaki program içinde Documents/mydb.db3bir veritabanı oluşturur ve veritabanı daha önce yoksa örnek verilerle doldurulur. Ardından veritabanı sorgulanır ve çıkış öğesine stderryazılır.

Başvuru Ekle

İlk olarak, Başvurular düğümüne sağ tıklayın ve Başvuruları Düzenle... öğesini ve öğesini seçin System.Data Mono.Data.Sqlite:

Adding new references

Örnek Kod

Aşağıdaki kod, eklenmiş SQL komutlarını kullanarak tablo oluşturma ve satır ekleme işleminin basit bir örneğini gösterir:

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

Önemli

Yukarıdaki kod örneğinde belirtildiği gibi, kodunuzu SQL eklemeye karşı savunmasız hale getirdiğinden SQL komutlarına dize eklemek kötü bir uygulamadır.

Komut Parametrelerini Kullanma

Aşağıdaki kod, kullanıcı tarafından girilen metni veritabanına güvenli bir şekilde eklemek için komut parametrelerinin nasıl kullanılacağını gösterir (metin tek kesme işareti gibi özel SQL karakterleri içerse bile):

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

Eksik İşlevsellik

Hem System.Data hem de Mono.Data.Sqlite bazı işlevler eksik.

System.Data

System.Data.dll eksik işlevler şunlardan oluşur:

Mono.Data.Sqlite

Bu arada, Mono.Data.Sqlite.dll kaynak kodunda değişiklik olmadı, ancak bunun yerine SQLite 3.5'i bağladığından Mono.Data.Sqlite.dll bir dizi çalışma zamanı sorununa ev sahipliği yapabilir. Bu arada iOS 8, SQLite 3.8.5 ile birlikte gelir. İki sürüm arasında bazı şeylerin değiştiğini söylemek yeterlidir.

iOS'un eski sürümü aşağıdaki SQLite sürümleriyle birlikte gönderlenmektedir:

  • iOS 7 - sürüm 3.7.13.
  • iOS 6 - sürüm 3.7.13.
  • iOS 5 - sürüm 3.7.7.
  • iOS 4 - sürüm 3.6.22.

En yaygın sorunlar veritabanı şeması sorgulamayla ilgili gibi görünüyor; örneğin çalışma zamanında belirli bir tabloda hangi sütunların mevcut olduğunu belirleme (Mono.Data.Sqlite.SqliteConnection.GetSchemaDb Bağlan ion'ı geçersiz kılma gibi). GetSchema ve Mono.Data.Sqlite.SqliteDataReader.GetSchemaTable (DbDataReader.GetSchemaTable geçersiz kılınıyor. Kısacası, DataTable kullanan herhangi bir şeyin çalışma olasılığı düşüktür.

Veri Bağlama

Veri Bağlama şu anda desteklenmiyor.