Herramientas de usuario

Herramientas del sitio


highlevel:csharp:apps

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
highlevel:csharp:apps [2008/12/28 10:31]
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 960: Línea 1026:
 } }
 </​code>​ </​code>​
 +
  
 ==== Otros ==== ==== Otros ====
Línea 979: Línea 1046:
 <​control>​.PointToScreen(<​point>​) <​control>​.PointToScreen(<​point>​)
 </​code>​ </​code>​
 +===== Notas =====
 +
 +
 +==== 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:
 +  * 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.
highlevel/csharp/apps.1230460278.txt.gz · Última modificación: 2020/05/09 09:24 (editor externo)