System.Data in Xamarin.iOS
Xamarin.iOS 8.10 aggiunge il supporto per System.Data, incluso il Mono.Data.Sqlite.dll
provider ADO.NET. Il supporto include l'aggiunta degli assembly seguenti:
System.Data.dll
System.Data.Service.Client.dll
System.Transactions.dll
Mono.Data.Tds.dll
Mono.Data.Sqlite.dll
Esempio
Il programma seguente crea un database in Documents/mydb.db3
e, se il database non esiste in precedenza, viene popolato con dati di esempio. Il database viene quindi sottoposto a query, con l'output scritto in stderr
.
Aggiungere riferimenti
Fare prima clic con il pulsante destro del mouse sul nodo Riferimenti e scegliere Modifica riferimenti, quindi selezionare System.Data
e Mono.Data.Sqlite
:
Codice di esempio
Il codice seguente illustra un semplice esempio di creazione di una tabella e inserimento di righe usando comandi SQL incorporati:
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]);
}
}
Importante
Come accennato nell'esempio di codice precedente, è consigliabile incorporare stringhe nei comandi SQL perché rende il codice vulnerabile all'inserimento DI SQL.
Uso di parametri di comando
Il codice seguente illustra come usare i parametri di comando per inserire testo immesso dall'utente in modo sicuro nel database (anche se il testo contiene caratteri SQL speciali come apostrofo singolo):
// 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 ();
}
Funzionalità mancanti
Sia System.Data che Mono.Data.Sqlite mancano alcune funzionalità.
System.Data
La funzionalità mancante da System.Data.dll è costituita da:
- Qualsiasi elemento che richiede System.CodeDom (ad esempio System.Data.TypedDataSetGenerator )
- Supporto dei file di configurazione XML ( ad esempio System.Data.Common.DbProviderConfigurationHandler )
- System.Data.Common.DbProviderFactories (dipende dal supporto dei file di configurazione XML)
- System.Data.OleDb
- System.Data.Odbc
- La
System.EnterpriseServices.dll
dipendenza è stata rimossa daSystem.Data.dll
, con conseguente rimozione di Sql Connessione ion. Metodo EnlistDistributedTransaction(ITransaction).
Mono.Data.Sqlite
Nel frattempo, Mono.Data.Sqlite.dll non ha subito modifiche al codice sorgente, ma potrebbe invece essere host di diversi problemi di runtime , perché Mono.Data.Sqlite.dll
associa SQLite 3.5. iOS 8, nel frattempo, viene fornito con SQLite 3.8.5. Basta dire, alcune cose sono cambiate tra le due versioni.
La versione precedente di iOS è disponibile con le versioni seguenti di SQLite:
- iOS 7 - versione 3.7.13.
- iOS 6 - versione 3.7.13.
- iOS 5 - versione 3.7.7.
- iOS 4 - versione 3.6.22.
I problemi più comuni sembrano essere correlati all'esecuzione di query sullo schema del database, ad esempio determinare in fase di esecuzione quali colonne esistono in una determinata tabella, ad esempio Mono.Data.Sqlite.SqliteConnection.GetSchema
(override di Db Connessione ion. GetSchema e Mono.Data.Sqlite.SqliteDataReader.GetSchemaTable
(override di DbDataReader.GetSchemaTable. In breve, sembra che qualsiasi elemento che usa DataTable non funzioni correttamente.
Data Binding
Il data binding non è attualmente supportato.