System.Data w środowisku Xamarin.iOS
Platforma Xamarin.iOS 8.10 dodaje obsługę pliku System.Data, w tym Mono.Data.Sqlite.dll
dostawcę ADO.NET. Obsługa obejmuje dodanie następujących zestawów:
System.Data.dll
System.Data.Service.Client.dll
System.Transactions.dll
Mono.Data.Tds.dll
Mono.Data.Sqlite.dll
Przykład
Poniższy program tworzy bazę danych w programie Documents/mydb.db3
, a jeśli baza danych nie istnieje wcześniej, zostanie wypełniona przykładowymi danymi. Następnie jest wysyłana zapytanie do bazy danych z danymi wyjściowymi zapisanymi w pliku stderr
.
Dodawanie odwołań
Najpierw kliknij prawym przyciskiem myszy węzeł Odwołania i wybierz polecenie Edytuj odwołania... a następnie wybierz polecenie i Mono.Data.Sqlite
:System.Data
Przykładowy kod
Poniższy kod przedstawia prosty przykład tworzenia tabeli i wstawiania wierszy przy użyciu osadzonych poleceń 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]);
}
}
Ważne
Jak wspomniano w powyższym przykładzie kodu, dobrym rozwiązaniem jest osadzanie ciągów w poleceniach SQL, ponieważ sprawia, że kod jest podatny na wstrzyknięcie kodu SQL.
Używanie parametrów polecenia
Poniższy kod pokazuje, jak bezpiecznie wstawić tekst wprowadzony przez użytkownika do bazy danych przy użyciu parametrów polecenia (nawet jeśli tekst zawiera specjalne znaki SQL, takie jak pojedynczy 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 ();
}
Brak funkcji
Brakuje niektórych funkcji zarówno System.Data , jak i Mono.Data.Sqlite .
System.Data
Brak funkcji w System.Data.dll składa się z następujących elementów:
- Wszystkie elementy wymagające elementu System.CodeDom (np. System.Data.TypedDataSetGenerator )
- Obsługa plików konfiguracji XML (np. System.Data.Common.DbProviderConfigurationHandler )
- System.Data.Common.DbProviderFactories (zależy od obsługi plików konfiguracji XML)
- System.data.oledb
- System.data.odbc
- Zależność została usunięta
System.EnterpriseServices.dll
zSystem.Data.dll
klasy , co spowodowało usunięcie sql Połączenie ion. EnlistDistributedTransaction(ITransaction), metoda.
Mono.Data.Sqlite
W międzyczasie, Mono.Data.Sqlite.dll nie doznał żadnych zmian kodu źródłowego, ale zamiast tego może być hostem do wielu problemów ze środowiskiem uruchomieniowym, ponieważ Mono.Data.Sqlite.dll
wiąże SQLite 3.5. Tymczasem system iOS 8 jest dostarczany z funkcją SQLite 3.8.5. Wystarczy powiedzieć, że niektóre rzeczy zmieniły się między dwiema wersjami.
Starsza wersja systemu iOS jest dostarczana z następującymi wersjami biblioteki SQLite:
- iOS 7 — wersja 3.7.13.
- iOS 6 — wersja 3.7.13.
- iOS 5 — wersja 3.7.7.
- iOS 4 — wersja 3.6.22.
Najbardziej typowe problemy wydają się być związane z wykonywaniem zapytań dotyczących schematu bazy danych, np. określanie w czasie wykonywania, które kolumny istnieją w danej tabeli, takie jak Mono.Data.Sqlite.SqliteConnection.GetSchema
(zastępowanie bazy danych Połączenie ion. GetSchema i Mono.Data.Sqlite.SqliteDataReader.GetSchemaTable
(przesłanianie tabeli DbDataReader.GetSchemaTable. Krótko mówiąc, wydaje się, że wszystko, co korzysta z usługi DataTable , jest mało prawdopodobne, aby działało.
Powiązanie danych
Powiązanie danych nie jest obecnie obsługiwane.