Xamarin.ios의 system.objectSystem.Data in Xamarin.iOS

Xamarin.ios 8.10 Mono.Data.Sqlite.dll ADO.NET 공급자를 포함 하 여 system.web에 대 한 지원을 추가 합니다.Xamarin.iOS 8.10 adds support for System.Data, including the Mono.Data.Sqlite.dll ADO.NET provider. 지원에는 다음 어셈블리를 추가 하는 기능이 포함 됩니다.Support includes the addition of the following assemblies:

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

예제Example

다음 프로그램은 Documents/mydb.db3에서 데이터베이스를 만들고, 데이터베이스가 이전에 존재 하지 않는 경우 예제 데이터로 채워집니다.The following program creates a database in Documents/mydb.db3, and if the database doesn't previously exist it is populated with sample data. 그런 다음 stderr에 기록 된 출력을 사용 하 여 데이터베이스를 쿼리 합니다.The database is then queried, with the output written to stderr.

참조 추가Add References

먼저 참조 노드를 마우스 오른쪽 단추로 클릭 하 고 참조 편집 ...을 선택 하 고 System.Data를 선택한 다음 Mono.Data.Sqlite합니다.First, right-click on the References node and choose Edit References... then select System.Data and Mono.Data.Sqlite:

샘플 코드Sample Code

다음 코드에서는 테이블을 만들고 포함 된 SQL 명령을 사용 하 여 행을 삽입 하는 간단한 예를 보여 줍니다.The following code shows a simple example of creating a table and inserting rows using embedded SQL commands:

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 삽입에 취약 하 게 만드는 것이 좋습니다.As mentioned in the code sample above, it is bad practice to embed strings in SQL commands because it makes your code vulnerable to SQL injection.

Command 매개 변수 사용Using Command Parameters

다음 코드에서는 명령 매개 변수를 사용 하 여 사용자가 입력 한 텍스트를 데이터베이스에 안전 하 게 삽입 하는 방법을 보여 줍니다 (텍스트에 단일 아포스트로피와 같은 특수 SQL 문자가 포함 된 경우에도).The following code shows how to use command parameters to insert user-entered text safely into the database (even if the text contains special SQL characters like single-apostrophe):

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

누락 된 기능Missing Functionality

System.objectMono. Sqlite 에는 일부 기능이 없습니다.Both System.Data and Mono.Data.Sqlite are missing some functionality.

System.DataSystem.Data

System.object 에서 누락 된 기능은 다음과 같이 구성 됩니다.Functionality missing from System.Data.dll consists of:

Mono. SqliteMono.Data.Sqlite

한편, Mono. a l l. a l l. a l l. l i 3.5 Mono.Data.Sqlite.dll d.Meanwhile, Mono.Data.Sqlite.dll suffered no source code changes, but instead may be host to a number of runtime issues since Mono.Data.Sqlite.dll binds SQLite 3.5. iOS 8은 SQLite 3.8.5와 함께 제공 됩니다.iOS 8, meanwhile, ships with SQLite 3.8.5. 즉, 두 버전 간에 몇 가지 사항이 변경 되었습니다.Suffice it to say, some things have changed between the two versions.

이전 버전의 iOS에는 다음 버전의 SQLite가 제공 됩니다.Older version of iOS ship with the following versions of SQLite:

  • iOS 7 -버전 3.7.13.iOS 7 - version 3.7.13.
  • iOS 6 -버전 3.7.13.iOS 6 - version 3.7.13.
  • iOS 5 -버전 3.7.7.iOS 5 - version 3.7.7.
  • iOS 4 -버전 3.6.22.iOS 4 - version 3.6.22.

가장 일반적인 문제는 데이터베이스 스키마 쿼리와 관련이 있습니다. 예를 들어 Mono.Data.Sqlite.SqliteConnection.GetSchema (예: DbConnectionMono.Data.Sqlite.SqliteDataReader.GetSchemaTable를 재정의 하 여 지정 된 테이블에 존재 하는 열을 런타임에 확인 하는 것과 같습니다 (재정의 DbDataReader. GetSchemaTableThe most common issues appear to be related to database schema querying, e.g. determining at runtime which columns exist on a given table, such as Mono.Data.Sqlite.SqliteConnection.GetSchema (overriding DbConnection.GetSchema and Mono.Data.Sqlite.SqliteDataReader.GetSchemaTable (overriding DbDataReader.GetSchemaTable. 즉, DataTable 을 사용 하는 모든 항목이 작동 하지 않는 것 같습니다.In short, it seems that anything using DataTable is unlikely to work.

데이터 바인딩Data Binding

지금은 데이터 바인딩이 지원 되지 않습니다.Data Binding is not supported at this time.