다음을 통해 공유


Xamarin.iOS의 System.Data

Xamarin.iOS 8.10은 ADO.NET 공급자를 포함하여 System.DataMono.Data.Sqlite.dll 대한 지원을 추가합니다. 지원에는 다음 어셈블리가 추가됩니다.

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

예시

다음 프로그램에서는 데이터베이스 Documents/mydb.db3를 만들고 데이터베이스가 이전에 존재하지 않는 경우 샘플 데이터로 채워집니다. 그런 다음 출력이 .에 기록된 상태에서 데이터베이스를 쿼리합니다 stderr.

참조 추가

먼저 참조 노드를 마우스 오른쪽 단추로 클릭하고 참조 편집을 선택한 다음, 다음을 선택합니다 System.DataMono.Data.Sqlite.

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

Important

위의 코드 샘플에서 멘션 코드가 SQL 삽입에 취약하기 때문에 SQL 명령에 문자열을 포함하는 것은 잘못된 방법입니다.

Command 매개 변수 사용

다음 코드에서는 명령 매개 변수를 사용하여 사용자가 입력한 텍스트를 데이터베이스에 안전하게 삽입하는 방법을 보여 줍니다(텍스트에 단일 아포스트로피와 같은 특수 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.DataMono.Data.Sqlite 모두 일부 기능이 누락되었습니다.

System.Data

System.Data.dll 누락된 기능은 다음으로 구성됩니다.

Mono.Data.Sqlite

한편, Mono.Data.Sqlite.dll 소스 코드 변경을 겪지 않았지만 대신 SQLite 3.5를 바인딩하기 때문에 Mono.Data.Sqlite.dll 많은 런타임 문제가 발생할 수 있습니다. 한편 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)을 결정합니다. GetSchemaMono.Data.Sqlite.SqliteDataReader.GetSchemaTable (DbDataReader.GetSchemaTable 재정의) 즉, DataTable을 사용하는 모든 항목이 작동하지 않을 것으로 보입니다.

데이터 바인딩

데이터 바인딩은 현재 지원되지 않습니다.