Xamarin.iOS'ta System.Data
Xamarin.iOS 8.10, ADO.NET sağlayıcısı da dahil olmak üzere Mono.Data.Sqlite.dll
System.Data için destek ekler. Destek, aşağıdaki derlemelerin eklenmesini içerir:
System.Data.dll
System.Data.Service.Client.dll
System.Transactions.dll
Mono.Data.Tds.dll
Mono.Data.Sqlite.dll
Örnek
Aşağıdaki program içinde Documents/mydb.db3
bir veritabanı oluşturur ve veritabanı daha önce yoksa örnek verilerle doldurulur. Ardından veritabanı sorgulanır ve çıkış öğesine stderr
yazılır.
Başvuru Ekle
İlk olarak, Başvurular düğümüne sağ tıklayın ve Başvuruları Düzenle... öğesini ve öğesini seçin System.Data
Mono.Data.Sqlite
:
Örnek Kod
Aşağıdaki kod, eklenmiş SQL komutlarını kullanarak tablo oluşturma ve satır ekleme işleminin basit bir örneğini 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 SQL eklemeye karşı savunmasız hale getirdiğinden SQL komutlarına dize eklemek kötü bir uygulamadır.
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ılacağını gösterir (metin tek kesme işareti gibi özel SQL karakterleri içerse bile):
// 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 hem de Mono.Data.Sqlite bazı işlevler eksik.
System.Data
System.Data.dll eksik işlevler şunlardan oluşur:
- System.CodeDom gerektiren her şey (örneğin, System.Data.TypedDataSetGenerator )
- XML yapılandırma dosyası desteği (örneğin, 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
System.EnterpriseServices.dll
Bağımlılık öğesindenSystem.Data.dll
kaldırıldı ve sql Bağlan ion kaldırıldı. EnlistDistributedTransaction(ITransaction) yöntemi.
Mono.Data.Sqlite
Bu arada, Mono.Data.Sqlite.dll kaynak kodunda değişiklik olmadı, ancak bunun yerine SQLite 3.5'i bağladığından Mono.Data.Sqlite.dll
bir dizi çalışma zamanı sorununa ev sahipliği yapabilir. Bu arada iOS 8, SQLite 3.8.5 ile birlikte gelir. İki sürüm arasında bazı şeylerin değiştiğini söylemek yeterlidir.
iOS'un eski sürümü aşağıdaki SQLite sürümleriyle birlikte gönderlenmektedir:
- 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üyor; örneğin çalışma zamanında belirli bir tabloda hangi sütunların mevcut olduğunu belirleme (Mono.Data.Sqlite.SqliteConnection.GetSchema
Db Bağlan ion'ı geçersiz kılma gibi). GetSchema ve Mono.Data.Sqlite.SqliteDataReader.GetSchemaTable
(DbDataReader.GetSchemaTable geçersiz kılınıyor. Kısacası, DataTable kullanan herhangi bir şeyin çalışma olasılığı düşüktür.
Veri Bağlama
Veri Bağlama şu anda desteklenmiyor.