Xamarin.iOS'ta System.Data
Xamarin.iOS 8.10, sistem sağlayıcısı da dahil olmak üzere System.Data ADO.NET ekler. Destek, aşağıdaki derlemelerin eklerini içerir:
System.Data.dllSystem.Data.Service.Client.dllSystem.Transactions.dllMono.Data.Tds.dllMono.Data.Sqlite.dll
Örnek
Aşağıdaki program içinde bir veritabanı oluşturur ve veritabanı önceden Documents/mydb.db3 yoksa örnek verilerle doldurulur. Daha sonra veritabanı sorgulanan ve çıkışına yazılmış olan stderr .
Başvuru Ekleme
İlk olarak Başvurular düğümüne sağ tıklayın ve Başvuruları Düzenle... seçeneğini ve ardından öğesini seçin:
Örnek Kod
Aşağıdaki kod, tablo oluşturmanın ve katıştırılmış komutlar kullanarak satır eklemenin basit bir SQL gösterir:
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]);
}
}
Önemli
Yukarıdaki kod örneğinde belirtildiği gibi, kodunuzu kod eklemeye karşı savunmasız hale SQL komutlara dize eklemek SQL olur.
Komut Parametrelerini Kullanma
Aşağıdaki kod, kullanıcı tarafından girilen metni veritabanına güvenli bir şekilde eklemek için komut parametrelerinin nasıl kullanıla (metin tek kesme işareti gibi özel SQL karakterler içeriyor olsa bile) gösterir:
// 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 ();
}
Eksik İşlevsellik
Hem System.Data hemde Mono.Data.Sqlite'ın bazı işlevleri eksik.
System.Data
Eksik işlevler System.Data.dll oluşur:
- System.CodeDom gerektiren her şey (örn. System.Data.TypedDataSetGenerator )
- XML yapılandırma dosyası desteği (örn. System.Data.Common.DbProviderConfigurationHandler )
- System.Data.Common.DbProviderFactories (XML yapılandırma dosyası desteğine bağlıdır)
- System.Data.OleDb
- System.Data.Odbc
- bağımlılığı
System.EnterpriseServices.dll,System.EnterpriseServices.dllSystem.Data.dllSystem.Data.dllyönteminin kaldırılmasıyla sonuçlanıyor.
Mono.Data.Sqlite
Bu arada,Mono.Data.Sqlite.dll kod değişikliğine gerek yoktur, ancak SQLite 3.5'i bağlayacak şekilde bunun yerine bir dizi çalışma zamanı sorunu barındırabilir. Bu arada iOS 8, SQLite 3.8.5 ile birlikte geliyor. İki sürüm arasında bazı şeyler değişti.
iOS'un eski sürümü, aşağıdaki SQLite sürümleriyle birlikte sevk edildi:
- iOS 7 - sürüm 3.7.13.
- iOS 6 - sürüm 3.7.13.
- iOS 5 - sürüm 3.7.7.
- iOS 4 - sürüm 3.6.22.
En yaygın sorunlar veritabanı şeması sorgulamayla ilgili gibi görünür. Örneğin, çalışma zamanında belirli bir tabloda hangi sütunların mevcut olduğunu belirleme Mono.Data.Sqlite.SqliteConnection.GetSchemaMono.Data.Sqlite.SqliteConnection.GetSchema geçersiz kılma ve Mono.Data.Sqlite.SqliteDataReader.GetSchemaTableMono.Data.Sqlite.SqliteDataReader.GetSchemaTablegeçersiz kılınır). Kısacası, DataTable kullanan her şeyin çalışma ihtimali düşük gibi görünüyor.
Veri Bağlama
Veri Bağlama şu anda desteklenmiyor.
