System.Data в Xamarin.iOS

Xamarin.iOS 8.10 добавляет поддержку System.Data, включая Mono.Data.Sqlite.dll поставщика ADO.NET. Поддержка включает добавление следующих сборок:

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

Пример

Следующая программа создает базу данных в Documents/mydb.db3, и если база данных ранее не существует, она заполняется примерами данных. Затем база данных запрашивается с выходными данными, записанными в stderr.

Добавление ссылок

Сначала щелкните правой кнопкой мыши узел "Ссылки" и выберите пункт "Изменить ссылки", а затем выберите иMono.Data.Sqlite:System.Data

Adding new references

Пример кода

В следующем коде показан простой пример создания таблицы и вставки строк с помощью внедренных команд 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]);
    }
}

Внимание

Как упоминание в приведенном выше примере кода, не рекомендуется внедрять строки в команды SQL, так как это делает код уязвимым для внедрения SQL.

Использование параметров команды

В следующем коде показано, как использовать параметры команды для безопасного вставки введенного пользователем текста в базу данных (даже если текст содержит специальные символы SQL, такие как одноапострог):

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

Отсутствующие функции

В System.Data и Mono.Data.Sqlite отсутствуют некоторые функции.

System.Data

Функции, отсутствующие в System.Data.dll , состоят из следующих элементов:

Mono.Data.Sqlite

Между тем, Mono.Data.Sqlite.dll не страдали изменениями исходного кода, но вместо этого могут размещаться в ряде проблем среды выполнения , так как Mono.Data.Sqlite.dll привязывает SQLite 3.5. iOS 8, тем временем, поставляется с SQLite 3.8.5. Достаточно сказать, что некоторые вещи изменились между двумя версиями.

Более ранняя версия iOS поставляется со следующими версиями SQLite:

  • iOS 7 — версия 3.7.13.
  • iOS 6 — версия 3.7.13.
  • iOS 5 — версия 3.7.7.
  • iOS 4 — версия 3.6.22.

Наиболее распространенные проблемы, как представляется, связаны с запросом схемы базы данных, например определение столбцов во время выполнения, которые существуют в данной таблице, например Mono.Data.Sqlite.SqliteConnection.GetSchema (переопределение Db Подключение ion. GetSchema и Mono.Data.Sqlite.SqliteDataReader.GetSchemaTable (переопределение DbDataReader.GetSchemaTable. Короче говоря, кажется, что все, что использует DataTable , вряд ли будет работать.

Привязка данных

Привязка данных в настоящее время не поддерживается.