Xamarin. iOS のシステムデータ

Xamarin. iOS 8.10 では、ADO.NET プロバイダーを含む、 system.string のサポートが追加されます。 サポートには、次の アセンブリの追加が含まれます。

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

次のプログラムでは、にデータベースを作成し Documents/mydb.db3 ます。データベースが以前に存在していない場合は、サンプルデータが設定されます。 次に、データベースに対してクエリが作成され、出力がに書き込まれ stderr ます。

参照の追加

最初に、[参照] ノードを右クリックし、[参照の編集] を選択します。次に、[and] を選択します。

新しい参照の追加

サンプル コード

次のコードは、埋め込み 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 ();
}

不足している機能

システムデータMono. Sqliteの両方に、いくつかの機能がありません。

System.Data

System.Data.dllにない機能は次のもので構成されます。

Mono. Data. Sqlite

一方、 Mono.Data.Sqlite.dll ではソースコードの変更はありませんが、代わりに SQLite 3.5 をバインドしているため、多くの 実行時 の問題が発生する可能性があり ます。 一方、iOS 8 には SQLite 3.8.5 が付属しています。 ここでは、2つのバージョンの間で変更されたものがあるとします。

以前のバージョンの 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 ( Mono.Data.Sqlite.SqliteConnection.GetSchema とのオーバーライド Mono.Data.Sqlite.SqliteDataReader.GetSchemaTable ( Mono.Data.Sqlite.SqliteDataReader.GetSchemaTableオーバーライド) などです。 つまり、 DataTable を使用しているものはほとんど動作しないように思えます。

データ バインディング

現時点では、データバインディングはサポートされていません。