System.Data in Xamarin.iOS
Xamarin.iOS 8.10 bietet Unterstützung für System.Data, einschließlich des Mono.Data.Sqlite.dll
ADO.NET-Anbieters. Die Unterstützung umfasst das Hinzufügen der folgenden Assemblys:
System.Data.dll
System.Data.Service.Client.dll
System.Transactions.dll
Mono.Data.Tds.dll
Mono.Data.Sqlite.dll
Beispiel
Das folgende Programm erstellt eine Datenbank in Documents/mydb.db3
, und wenn die Datenbank noch nicht vorhanden ist, wird sie mit Beispieldaten aufgefüllt. Die Datenbank wird dann abgefragt, wobei die Ausgabe in stderr
geschrieben wird.
Hinzufügen von Verweisen
Klicken Sie zunächst mit der rechten Maustaste auf den Knoten Verweise, und wählen Sie Verweise bearbeiten... aus, und wählen Sie dann und Mono.Data.Sqlite
ausSystem.Data
:
Beispielcode
Der folgende Code zeigt ein einfaches Beispiel für das Erstellen einer Tabelle und das Einfügen von Zeilen mit eingebetteten SQL-Befehlen:
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]);
}
}
Wichtig
Wie im obigen Codebeispiel erwähnt, ist es eine schlechte Methode, Zeichenfolgen in SQL-Befehle einzubetten, da ihr Code dadurch anfällig für SQL-Einschleusung wird.
Verwenden von CommandParameter-Eigenschaften
Der folgende Code zeigt, wie Sie befehlsparameter verwenden, um vom Benutzer eingegebenen Text sicher in die Datenbank einzufügen (auch wenn der Text spezielle SQL-Zeichen wie Single-Apostroph enthält):
// 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 ();
}
Fehlende Funktionalität
Sowohl System.Data als auch Mono.Data.Sqlite fehlen einige Funktionen.
System.Data
Funktionen, die inSystem.Data.dll fehlen, bestehen aus:
- Alles, was System.CodeDom erfordert (z. B. System.Data.TypedDataSetGenerator )
- Unterstützung von XML-Konfigurationsdateien (z. B. System.Data.Common.DbProviderConfigurationHandler )
- System.Data.Common.DbProviderFactories (abhängig von der Unterstützung der XML-Konfigurationsdatei)
- System.Data.OleDb
- System.Data.Odbc
- Die
System.EnterpriseServices.dll
Abhängigkeit wurde ausSystem.Data.dll
entfernt, wodurch die SqlConnection.EnlistDistributedTransaction(ITransaction)-Methode entfernt wurde.
Mono.Data.Sqlite
In der Zwischenzeit wurdenMono.Data.Sqlite.dll keine Quellcodeänderungen erlitten, sondern können stattdessen für eine Reihe von Laufzeitproblemen gehostet werden, da Mono.Data.Sqlite.dll
SQLite 3.5 gebunden wurde. iOS 8 wird in der Zwischenzeit mit SQLite 3.8.5 ausgeliefert. Es genügt zu sagen, dass sich einige Dinge zwischen den beiden Versionen geändert haben.
Ältere Versionen von iOS werden mit den folgenden Versionen von SQLite ausgeliefert:
- iOS 7 : Version 3.7.13.
- iOS 6 : Version 3.7.13.
- iOS 5 : Version 3.7.7.
- iOS 4 : Version 3.6.22.
Die häufigsten Probleme scheinen sich auf Datenbankschemaabfragen zu beziehen, z. B. das Bestimmen, welche Spalten in einer bestimmten Tabelle vorhanden sind, z Mono.Data.Sqlite.SqliteConnection.GetSchema
. B. (Überschreiben von DbConnection.GetSchema und Mono.Data.Sqlite.SqliteDataReader.GetSchemaTable
(Außerkraftsetzung von DbDataReader.GetSchemaTable. Kurz gesagt, es scheint, dass alles, was DataTable verwendet, unwahrscheinlich ist.
Datenbindung
Die Datenbindung wird derzeit nicht unterstützt.