System.Data v Xamarin.iOS
Xamarin.iOS 8.10 přidává podporu pro System.Data, včetně Mono.Data.Sqlite.dll
poskytovatele ADO.NET. Podpora zahrnuje přidání následujících sestavení:
System.Data.dll
System.Data.Service.Client.dll
System.Transactions.dll
Mono.Data.Tds.dll
Mono.Data.Sqlite.dll
Příklad
Následující program vytvoří databázi v Documents/mydb.db3
databázi a pokud databáze dříve neexistuje, naplní se ukázkovými daty. Databáze se pak dotazuje s výstupem zapsaným do stderr
.
Přidat odkazy
Nejprve klikněte pravým tlačítkem myši na uzel Odkazy a zvolte Upravit odkazy... a pak vyberte System.Data
a Mono.Data.Sqlite
:
Ukázka kódu
Následující kód ukazuje jednoduchý příklad vytvoření tabulky a vložení řádků pomocí vložených příkazů 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]);
}
}
Důležité
Jak je uvedeno v ukázce kódu výše, je vhodné vkládat řetězce do příkazů SQL, protože je váš kód zranitelný vůči injektáži SQL.
Použití parametrů příkazu
Následující kód ukazuje, jak pomocí parametrů příkazu bezpečně vložit uživatelem zadaný text do databáze (i když text obsahuje speciální znaky SQL, jako je single-apostrof):
// 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 ();
}
Chybějící funkce
Chybí některé funkce System.Data i Mono.Data.Sqlite .
System.Data
V System.Data.dll chybí funkce:
- Cokoli, co vyžaduje System.CodeDom (např. System.Data.TypedDataSetGenerator )
- Podpora konfiguračních souborů XML (např. System.Data.Common.DbProviderConfigurationHandler )
- System.Data.Common.DbProviderFactories (závisí na podpoře konfiguračních souborů XML)
- System.data.oledb
- System.data.odbc
- Závislost
System.EnterpriseServices.dll
byla odebrána zSystem.Data.dll
, což vede k odebrání Sql Připojení ion. Metoda EnlistDistributedTransaction(ITransaction).
Mono.Data.Sqlite
Mezitím Mono.Data.Sqlite.dll žádné změny zdrojového kódu, ale místo toho může být hostitelem řady problémů za běhu, protože Mono.Data.Sqlite.dll
sváže SQLite 3.5. iOS 8 mezitím dodává s SQLite 3.8.5. Stačí říct, že se mezi těmito dvěma verzemi změnily některé věci.
Starší verze iOS se dodává s následujícími verzemi SQLite:
- iOS 7 – verze 3.7.13.
- iOS 6 – verze 3.7.13.
- iOS 5 – verze 3.7.7.
- iOS 4 – verze 3.6.22.
Nejběžnější problémy se jeví jako související s dotazováním schématu databáze, například určením za běhu, které sloupce existují v dané tabulce, například Mono.Data.Sqlite.SqliteConnection.GetSchema
(přepsání databáze Připojení ionu). GetSchema a Mono.Data.Sqlite.SqliteDataReader.GetSchemaTable
(přepsání DbDataReader.GetSchemaTable. Stručně řečeno, zdá se, že cokoli, co používá DataTable , pravděpodobně nebude fungovat.
Datová vazba
Datová vazba se v tuto chvíli nepodporuje.