System.Data di Xamarin.iOS
Xamarin.iOS 8.10 menambahkan dukungan untuk System.Data, termasuk Mono.Data.Sqlite.dll
penyedia ADO.NET. Dukungan mencakup penambahan rakitan berikut:
System.Data.dll
System.Data.Service.Client.dll
System.Transactions.dll
Mono.Data.Tds.dll
Mono.Data.Sqlite.dll
Contoh
Program berikut membuat database di Documents/mydb.db3
, dan jika database sebelumnya tidak ada, itu diisi dengan data sampel. Database kemudian dikueri, dengan output yang ditulis ke stderr
.
Tambahkan Referensi
Pertama, klik kanan pada node Referensi dan pilih Edit Referensi... lalu pilih System.Data
dan Mono.Data.Sqlite
:
Kode Sampel
Kode berikut menunjukkan contoh sederhana membuat tabel dan menyisipkan baris menggunakan perintah SQL yang disematkan:
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]);
}
}
Penting
Seperti disebutkan dalam sampel kode di atas, adalah praktik buruk untuk menyematkan string dalam perintah SQL karena membuat kode Anda rentan terhadap injeksi SQL.
Menggunakan Parameter Perintah
Kode berikut menunjukkan cara menggunakan parameter perintah untuk menyisipkan teks yang dimasukkan pengguna dengan aman ke dalam database (bahkan jika teks berisi karakter SQL khusus seperti apostrof tunggal):
// 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 ();
}
Fungsionalitas Hilang
System.Data dan Mono.Data.Sqlite kehilangan beberapa fungsionalitas.
System.Data
Fungsionalitas yang hilang dari System.Data.dll terdiri dari:
- Apa pun yang memerlukan System.CodeDom (misalnya System.Data.TypedDataSetGenerator )
- Dukungan file konfigurasi XML (misalnya System.Data.Common.DbProviderConfigurationHandler )
- System.Data.Common.DbProviderFactories (tergantung pada dukungan file konfigurasi XML)
- System.Data.OleDb
- System.Data.Odbc
- Dependensi
System.EnterpriseServices.dll
dihapus dariSystem.Data.dll
, menghasilkan penghapusan Sql Koneksi ion. Metode EnlistDistributedTransaction(ITransaction).
Mono.Data.Sqlite
Sementara itu, Mono.Data.Sqlite.dll tidak mengalami perubahan kode sumber, tetapi mungkin menjadi host untuk sejumlah masalah runtime sejak Mono.Data.Sqlite.dll
mengikat SQLite 3.5. iOS 8, sementara itu, dikirim dengan SQLite 3.8.5. Cukup untuk mengatakannya, beberapa hal telah berubah di antara dua versi.
Versi lama iOS dikirim dengan versi SQLite berikut:
- iOS 7 - versi 3.7.13.
- iOS 6 - versi 3.7.13.
- iOS 5 - versi 3.7.7.
- iOS 4 - versi 3.6.22.
Masalah yang paling umum tampaknya terkait dengan kueri skema database, misalnya menentukan pada runtime mana kolom yang ada pada tabel tertentu, seperti Mono.Data.Sqlite.SqliteConnection.GetSchema
(menimpa Db Koneksi ion. GetSchema dan Mono.Data.Sqlite.SqliteDataReader.GetSchemaTable
(menimpa DbDataReader.GetSchemaTable. Singkatnya, tampaknya apa pun yang menggunakan DataTable tidak mungkin berfungsi.
Pengikatan Data
Pengikatan Data saat ini tidak didukung.