Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
highlevel:csharp:apps [2009/02/09 09:12] alfred |
highlevel:csharp:apps [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 424: | Línea 424: | ||
| === HelpProvider === | === HelpProvider === | ||
| Es una clase que encontramos en System.Windows.Forms, es un extensor de propiedades que, al colocarse en un contenedor nos permite que al estar sobre un control y clicar F1 nos aparezca un pequeño pop-up donde nos muestra un texto introducido en la Propiedad añadida HelpEstring. | Es una clase que encontramos en System.Windows.Forms, es un extensor de propiedades que, al colocarse en un contenedor nos permite que al estar sobre un control y clicar F1 nos aparezca un pequeño pop-up donde nos muestra un texto introducido en la Propiedad añadida HelpEstring. | ||
| + | |||
| ===== Acceso a datos ===== | ===== Acceso a datos ===== | ||
| Línea 429: | Línea 430: | ||
| + | |||
| + | |||
| + | ==== ADO.NET ==== | ||
| + | Es el conjunto de clases dentro del framework .NET enfocado al acceso a datos. Se divide en dos tipos de clases, las que sirven para acceder a los datos (DataProvider) y las que sirven para leer\manipular dichos datos (DataSet). \\ \\ | ||
| + | Todas estas clases se encuentran en ''System.Data''. | ||
| + | |||
| + | === Clases === | ||
| + | Clases de acceso datos según el proveedor (**DataProvider**), es decir SQLServer, Oracle... | ||
| + | * ''Connection'', clases que representan la conexión con la fuente de datos. | ||
| + | * ''Command'', sus objetos son necesarios para realizar acciones (lectura, modificación...) sobre la fuente de datos. | ||
| + | * ''Parameter'', los parámetros que se le pasan al objeto Command. | ||
| + | * ''DataAdapter'', conecta la DB con el DataSet. | ||
| + | * ''DataReader'', controla el acceso a los registros. | ||
| + | La clase DataSet representa un esquema de la fuente de datos (la estructura de la parte de la DB a la que se accede), conteniendo tablas, relaciones... Los objetos relacionados con un DataSet son: | ||
| + | * ''DataTable'', tabla de la base de datos. | ||
| + | * ''DataView'', representa la forma de ver los datos (sotre este se lanzan las clausulas "ORDER BY", "WHERE"...) | ||
| + | * ''DataColumn'', representa una columna de la tabla, con su nombre y su tipo. | ||
| + | * ''DataRow'', representa una fila de la tabla, nos permite leer y modificar los valores. | ||
| + | * ''DataRelation'', es una relación entre tables (clave primaria \ clave foranea). | ||
| + | * ''Constraint'', describe una propiedad de la base de datos que se debe cumplir (valores únicos, no nulos...). | ||
| + | |||
| + | Los ''DataSet'' se llenan a partir de los datos de una DB mediante un ''DataAdapter'' configurado a partir de un objeto ''Connection'' y otro ''Command'' (y este a su vez configurado mediante objetos ''Parameter''). \\ \\ | ||
| + | Ver ejemplos [[highlevel:csharp:snippets#trabajar_con_fuentes_de_datos|aquí]]. | ||
| + | |||
| + | === Cómo hacer una petición a BD? === | ||
| + | Para acceder a una DB MSSQLServer (por ejemplo) necesitaremos utilizar las clases que están dentro del namespace ''System.Data.SqlClient'' siguiendo los siguientes pasos: | ||
| + | - Crear conexión, inicializando un objeto ''SqlConnection'' a partir de una ''ConnectionString''. | ||
| + | - Abrir la conexión llamando al método ''Open'' del ''SqlConnection''. | ||
| + | - Crear un objeto ''SqlCommand'', que será el que contenga la consulta a realizar sobre la DB. Se le ha de pasar la conexión. | ||
| + | - Ejecutar el ''SqlCommand'': | ||
| + | - Mediante el método ''ExecuteReader''. Que devuelve un ''DataReader'' del cual se podrán ir recogiendo los valores mientras el método ''Read'' devuelva ''true''. | ||
| + | - Mediante el método ''ExecuteNonQuery''. Que devuelve el número de filas afectadas, para consultas que no sean //selects// sino //inserts//, //updates//... | ||
| + | <code csharp> | ||
| + | SqlConnection con = new SqlConnection(@"Data Source=VALLIRANA\ALSQLEXP;Initial Catalog=prueba;Integrated Security=True"); | ||
| + | con.Open(); | ||
| + | SqlCommand cmd = new SqlCommand("select * from personas", con); | ||
| + | SqlDataReader dr = cmd.ExecuteReader(); | ||
| + | while (dr.Read()) | ||
| + | Console.WriteLine("Nombre: {0}", String.Format(dr.GetValue(0).ToString())); | ||
| + | </code> | ||
| + | === Trabajar con Interfaces === | ||
| + | Las clases que envuelven la conexión a datos heredan de diversas interfaces las cuales nos pueden permitir realizar las consultas de forma global, independientemente del motor de base de datos. Algunas de estas interfaces son: ''IDbConnection'', ''IDbCommand'' o ''IDataReader''. Por ejemplo las utilizaríamos así: | ||
| + | <code csharp> | ||
| + | IDbConnection connection = new SqliteConnection(connectionString); // Aquí podríamos haber creado un OracleClient | ||
| + | connection.Open(); | ||
| + | IDbCommand cmd = this.connection.CreateCommand(); | ||
| + | cmd.CommandText = query; | ||
| + | this.reader = cmd.ExecuteReader(); // O ExecuteNonQuery si no es un Select | ||
| + | while (reader.Read()) | ||
| + | { ... } | ||
| + | reader.Close(); | ||
| + | connection.Close(); | ||
| + | </code> | ||
| + | |||
| + | ==== DataBinding ==== | ||
| + | Es la capacidad de enlazar automáticamente campos de un formulario con los datos que provienen de una DB. \\ | ||
| + | El ejemplo más sencillo es el de un TextBox denominado ''txtBox'', para asignarle el campo ''FirstName'' de la tabla ''Customers'' que es del tipo "Text" y lo encontramos en el ''DataSet'' denominado ''dsCust''. | ||
| + | <code csharp> | ||
| + | txtBox.DataBindings.Add("Text",dsCust,"Customers.FirstName"); | ||
| + | </code> | ||
| + | Para coger la posición actual utilizaremos la clase ''CurrencyManager'': | ||
| + | <code csharp> | ||
| + | CurrencyManager cm = (CurrencyManager)this.BindingContext[dsCust,"Customers"]; | ||
| + | long rowPosition = (long)cm.Position; | ||
| + | </code> | ||
| ==== Sobre SQL y ADO.NET ==== | ==== Sobre SQL y ADO.NET ==== | ||
| Línea 981: | Línea 1047: | ||
| </code> | </code> | ||
| ===== Notas ===== | ===== Notas ===== | ||
| - | ==== Acceso a controles desde distintos threads ==== | + | |
| + | |||
| + | ==== Aplicaciones Windows multithread ==== | ||
| A partir de la versión 2005 acceder a un control desde un thread distinto al que se creó se controla los errores de concurrencia que se puedan producir, las distintas soluciones pueden ser: | A partir de la versión 2005 acceder a un control desde un thread distinto al que se creó se controla los errores de concurrencia que se puedan producir, las distintas soluciones pueden ser: | ||
| * Poner la propiedad estática ''CheckForIllegalCrossThreadCalls'' de la clase ''Control'' a false. Esta es la solución más guarra, ya que el error puede seguir produciendose. | * Poner la propiedad estática ''CheckForIllegalCrossThreadCalls'' de la clase ''Control'' a false. Esta es la solución más guarra, ya que el error puede seguir produciendose. | ||
| + | * Usando un objeto **BackgroundWorker**. Esta clase se encarga de realizar una tarea en segundo plano, para utilizar un objeto de esta se le indicará el método que se desea realizar en segundo plano y luego llamar al método ''RunWorkerAsync'' del BackgroundWorker. Cuando acaba la tarea llama al evento ''RunWorkerCompleted''. | ||
| + | * Utilizando el método ''Invoke'' del control. | ||
| + | - Preguntamos la propiedad del control ''InvokeRequired''. | ||
| + | - Si está a ''true'' llamaremos a ''Invoke'' con un delegado que hace la llamada al control. | ||
| + | - Si está a ''false'' accederemos al control directamente. | ||