System.Data en Xamarin.iOS
Xamarin.iOS 8.10 agrega compatibilidad con System.Data,incluido ADO.NET proveedor. La compatibilidad incluye la adición de los ensamblados siguientes:
System.Data.dllSystem.Data.Service.Client.dllSystem.Transactions.dllMono.Data.Tds.dllMono.Data.Sqlite.dll
Ejemplo
El programa siguiente crea una base de datos en y, si la base de datos no existe anteriormente, se Documents/mydb.db3 rellena con datos de ejemplo. A continuación, se consulta la base de datos, con la salida escrita en stderr .
Agregar referencias
En primer lugar, haga clic con el botón derecho en el nodo Referencias y elija Editar referencias... y, a continuación, seleccione y :
Código de ejemplo
En el código siguiente se muestra un ejemplo sencillo de creación de una tabla e inserción de filas mediante comandos SQL insertados:
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]);
}
}
Importante
Como se mencionó en el ejemplo de código anterior, es una mala práctica insertar cadenas en SQL comandos porque hace que el código sea vulnerable a SQL inserción.
Uso de parámetros de comando
En el código siguiente se muestra cómo usar parámetros de comando para insertar texto escrito por el usuario de forma segura en la base de datos (incluso si el texto contiene caracteres SQL como apóstrofo único):
// 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 ();
}
Funcionalidad que falta
A System.Data yMono.Data.Sqlite les falta alguna funcionalidad.
System.Data
La funcionalidad que faltaSystem.Data.dll consta de:
- Todo lo que requiera System.CodeDom (por ejemplo, System.Data.TypedDataSetGenerator)
- Compatibilidad con archivos de configuración XML (por ejemplo, System.Data.Common.DbProviderConfigurationHandler)
- System.Data.Common.DbProviderFactories (depende de la compatibilidad con archivos de configuración XML)
- System.Data.OleDb
- System.Data.Odbc
- La dependencia se quitó de , lo que da lugar a la eliminación del método
System.EnterpriseServices.dllSystem.EnterpriseServices.dllSystem.Data.dllSystem.Data.dll
Mono.Data.Sqlite
Mientras tanto, Mono.Data.Sqlite.dll no ha sufrido ningún cambio en el código fuente, sino que puede ser el host de una serie de problemas en tiempo de ejecución, ya que enlaza SQLite 3.5. iOS 8, mientras tanto, se suministra con SQLite 3.8.5. Basta decir que algunas cosas han cambiado entre las dos versiones.
La versión anterior de iOS se envía con las siguientes versiones de SQLite:
- iOS 7: versión 3.7.13.
- iOS 6: versión 3.7.13.
- iOS 5: versión 3.7.7.
- iOS 4: versión 3.6.22.
Los problemas más comunes parecen estar relacionados con las consultas de esquema de base de datos, por ejemplo, determinar en tiempo de ejecución qué columnas existen en una tabla determinada, como Mono.Data.Sqlite.SqliteConnection.GetSchema (invalidar Mono.Data.Sqlite.SqliteConnection.GetSchema y Mono.Data.Sqlite.SqliteDataReader.GetSchemaTable (invalidar Mono.Data.Sqlite.SqliteDataReader.GetSchemaTable). En resumen, parece que es poco probable que todo lo que use DataTable funcione.
Enlace de datos
En este momento no se admite el enlace de datos.
