Xamarin.iOS'ta System.Data

Xamarin.iOS 8.10, sistem sağlayıcısı da dahil olmak üzere System.Data ADO.NET ekler. Destek, aşağıdaki derlemelerin eklerini 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 bir veritabanı oluşturur ve veritabanı önceden Documents/mydb.db3 yoksa örnek verilerle doldurulur. Daha sonra veritabanı sorgulanan ve çıkışına yazılmış olan stderr .

Başvuru Ekleme

İlk olarak Başvurular düğümüne sağ tıklayın ve Başvuruları Düzenle... seçeneğini ve ardından öğesini seçin:

Yeni başvurular ekleme

Örnek Kod

Aşağıdaki kod, tablo oluşturmanın ve katıştırılmış komutlar kullanarak satır eklemenin basit bir SQL 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 kod eklemeye karşı savunmasız hale SQL komutlara dize eklemek SQL olur.

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ıla (metin tek kesme işareti gibi özel SQL karakterler içeriyor olsa bile) gösterir:

// 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 hemde Mono.Data.Sqlite'ın bazı işlevleri eksik.

System.Data

Eksik işlevler System.Data.dll oluşur:

Mono.Data.Sqlite

Bu arada,Mono.Data.Sqlite.dll kod değişikliğine gerek yoktur, ancak SQLite 3.5'i bağlayacak şekilde bunun yerine bir dizi çalışma zamanı sorunu barındırabilir. Bu arada iOS 8, SQLite 3.8.5 ile birlikte geliyor. İki sürüm arasında bazı şeyler değişti.

iOS'un eski sürümü, aşağıdaki SQLite sürümleriyle birlikte sevk edildi:

  • 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ür. Örneğin, çalışma zamanında belirli bir tabloda hangi sütunların mevcut olduğunu belirleme Mono.Data.Sqlite.SqliteConnection.GetSchemaMono.Data.Sqlite.SqliteConnection.GetSchema geçersiz kılma ve Mono.Data.Sqlite.SqliteDataReader.GetSchemaTableMono.Data.Sqlite.SqliteDataReader.GetSchemaTablegeçersiz kılınır). Kısacası, DataTable kullanan her şeyin çalışma ihtimali düşük gibi görünüyor.

Veri Bağlama

Veri Bağlama şu anda desteklenmiyor.