J# UNIDAD 5: INTRODUCION A LAS BASES DE DATOS

TEMA 6: ADO NET ACTIVEX DATA OBJECT

EL NUEVO MODELO DE DATOS DE MICROSOFT ES ADO.NET, ESTE MODELO DESCANSA EN UNA SERIE DE OBJETOS ESPECIALIZADOS QUE FACILITAN EL PROCESAMIENTO DE UNA BASE DE DATOS.

image329.jpg

fuente microsoft net

Como ven esta bastante claro y no ocupa explicacion, :-)

Empezando:

El problema es comunicar un programa o aplicacion con una base de datos y mas que comunicar se pretende que el programa o aplicacion realize una serie de procesos u operaciones con la base de datos o mejor aun con el conjunto de tablas que contiene una base de datos.

La primera nota a recordar es que una base de datos puede estar fisicamente en el servidor y en algun folder o directorio del disco duro de dicha maquina servidora, por ejemplo, c:\progfacil\misitio\mibase.mbd, como se observa la base que se construyo en access (mibase.mbd) se almaceno en el disco c en el folder progfacil y dentro del subfolder misitio.

Sin embargo tambien es necesario conocer que asi como existen servidores de paginas(web server), servidores de correo (mail server), servidores de ftp (ftp server), etc, tambien existen servidores de bases de datos (database server), los mas comunes son el sqlserver de microsoft, oracle, mysql, etc, estos servidores tambien pueden crear, administrar y procesar una base de datos, por supuesto que el procedimiento que se dio para crearla en access en el tema anterior no se puede usar para crear y cargar una base de datos en un servidor de bases de datos.(esperar libros de bases de datos en programacionfacil en un proximo futuro).

El modo de comunicarse entre nuestro programa o aplicacion y la base de datos (ya sea fisica o de dbserver), implica que ambos manejen un lenguaje de programacion comun, es decir no se puede mandar una instruccion en csharp, o en basic o pascal, a la base de datos y ademas esperar que esta ultima la entienda ( para entender esto, una razon muy sencilla es que la base de datos tendria que conocer o comprender todos los lenguajes de programacion), para resolver este problema de comunicacion es que se usa un lenguaje comun de bases de datos que tanto los lenguajes de programacion existentes como las bases de datos entienden, este lenguaje comun de bases de datos es el SQL (structured query languaje) o lenguaje estructurado de consultas.

En otras palabras, ustedes mis estimados lectores tendran que aprender este nuevo lenguaje de programacion, el SQL, la buena noticia es que es un lenguaje con muy pocas instrucciones y ademas existen muy buenos tutoriales en internet que hay que buscar y estudiar.

PROPAGANDA, ya ven que en este curso estan aprendiendo el lenguaje de programacion JSHARP, el lenguaje de programacion HTML y ahora el lenguaje de programacion SQL, !wow! tres lenguajes por el precio de uno.

Bueno las principales instrucciones de SQL, que se usan en este curso son SELECT, INSERT, UPDATE y DELETE.

La pregunta es ahora como mandamos las instrucciones sql a la base de datos, la respuesta son los OBJETOS ADO.NET que estamos analizando en orden y proposito de uso, los estaremos explicando.

OBJETO CONNECTION:- OBJETO QUE SE UTILIZA PARA ESTABLECER UNA CONECCION O ENLACE A LA BASE DE DATOS.

Este objeto primero se tendra que crear en el programa y luego se tendra que cargar con dos parametros(ver ejemplo mas abajo), el primer parametro es el provedor o la fuente que proporcionara los datos, los provedores o fuentes de datos que existen son:

SQLSERVER NET DATA PROVIDER.- QUE SE ESPECIALIZA EN COMUNICARSE Y PROCESAR BASES DE DATOS CONSTRUIDAS CON MICROSOF SQL SERVER V7.0

OLEDB.NET DATA PROVIDER.- QUE SE ESPECIALIZA EN COMUNICARSE Y PROCESAR BASES DE DATOS QUE A LA FECHA DEL PRESENTE LIBRO UTILIZEN ALGUNOS DE LOS SIGUIENTES DRIVERS, SQLOLEDB ( VERSIONES ANTERIORES DE SQL SERVER DE MICROSOFT), MSDAORA (ORACLE), MICROSOFT.JET ( ACCESS Y ALGUNOS OTROS DBMS DE MICROSOFT)

ODBC.NET .- BASES DE DATOS QUE USAN ODBC COMO MEDIO DE COMUNICACION CON OTRAS BASES DE DATOS Y APLICACIONES, COMO NOTA A CONSIDERAR ODBC.NET NO ESTA INCLUIDA POR DEFAULT EN MICROSOFT.NET, SE TIENE QUE BAJAR DE MICROSOFT.

El segundo parametro es la propia base de datos con la cual se comunicara el programa o aplicacion.

Ejemplo del objeto CONNECTION

OleDbConnection coneccion;

coneccion = new OleDbConnection(“Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\progfacil\\tusitio\\mibase.mdb”);

Es una sola string y los dos parametros mencionados van separados por el punto y coma.

ejemplos de los otros poveedores o fuentes mencionados:

//Provider=MSDAORA; Data Source=ORACLE8i7; User ID=OLEDB; Password=OLEDB
//Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\bin\LocalAccess40.mdb;
//Provider=SQLOLEDB;Data Source=MySQLServer;Integrated Security=SSPI;

OBJETO COMMAND.- Este objeto puede contener directamente una instruccion SQL y enviarla al objeto coneccion ya descrito.

Este objeto command primero se tendra que crear y luego cargarle dos parametros que son:

la instruccion sql y el objeto conneccion que ya se vio en el parrafo anterior; ejemplo

OleDbCommand orden;

orden= new OleDbCommand(“select * from mitabla”, coneccion);

Si esta muy grande o muy compleja la instruccion sql, es mas conveniente crearla en una variable string y poner la variable como parametro ejemplo:

OleDbCommand orden;

String q=“select * from mitabla”;

orden= new OleDbCommand(q, coneccion);

Sin embargo ciertas instrucciones de sql ( ya estudiaron su tutorial del sql), requieren que se manden los datos a la base de datos, respetando el tipo de dato con los cuales los creo el software de bases de datos, por ejemplo si edad en access se declaro como NUMBER, la instruccion sql que prentenda cargar dicho campo, tiene la obligacion de mandarla con este tipo de dato asociado, instrucciones SQL que permiten cargar o capturar ese campo edad son INSERT o UPADTE ( ya estudiaron su tutorial de SQL).

Para resolver este problema, usaremos en la string q, unas variables llamadas VARIABLES PARAMETROS que se simbolizan usando el simbolo @ antes de la variable y ademas al objeto COMMAND le agregamos dos instrucciones extras que permiten agregar a la string q el dato y el tipo de dato, ejemplo, se tienen seis renglones ya capturados en nuestra tabla y se quiere agregar un septimo renglon con los siguientes datos, clave=7, nombre=“rana” peso=3.14 , usaremos una instruccion SQL INSERT ej:

OleDbCommand orden;
String q="insert into mitabla(clave,nombre,edad) values(@CLAVE, @NOMBRE, @EDAD)";
OleDbCommand orden= new OleDbCommand(q, coneccion);
orden.get_Parameters().Add(new OleDbParameter("@CLAVE", OleDbType.Integer));
orden.get_Parameters().get_Item("@CLAVE").set_Value(CLAVE.get_Text());
orden.get_Parameters().Add(new OleDbParameter("@NOMBRE", OleDbType.VarWChar, 20));
orden.get_Parameters().get_Item("@NOMBRE").set_Value(NOMBRE.get_Text());
orden.get_Parameters().Add(new OleDbParameter("@EDAD", OleDbType.Integer));
orden.get_Parameters().get_Item("@EDAD").set_Value(EDAD.get_Text());
// recordar ademas que command ocupa tres instrucciones extras que estan abajo
orden.get_Connection().Open();
orden.ExecuteNonQuery();
orden.get_Connection().Close();

Observar que para cada variable parametro, se tienen que cargar dos elementos, el valor y el tipo de dato correpondiente.

Aunque en valor se manda string's en oledbtype se hace un mapeo, relacion o conversion al tipo de dato que se uso en access, tener mucho cuidado que exista una relacion igual o cuando este pograma se ejecute el servidor les va a mandar un error o excepcion de sql, que les intenta decir que el tipo de dato que mandaron a la base de datos, no es igual al que se uso para crearlo en la base de datos.

Los OLEDBTYPE mas comunes son:

BigInt A 64-bit signed integer (DBTYPE_I8). This maps to Int64.

Binary A stream of binary data (DBTYPE_BYTES). This maps to an Array of type Byte.

Boolean A Boolean value (DBTYPE_BOOL). This maps to Boolean.

BSTR A null-terminated character string of Unicode characters (DBTYPE_BSTR). This maps to String.

Char A character string (DBTYPE_STR). This maps to String.

Currency A currency value ranging from -263 (or -922,337,203,685,477.5808) to 2 63 -1 (or +922,337,203,685,477.5807) with an accuracy to a ten-thousandth of a currency unit (DBTYPE_CY). This maps to Decimal.

Date Date data, stored as a double (DBTYPE_DATE). The whole portion is the number of days since December 30, 1899, while the fractional portion is a fraction of a day. This maps to DateTime.

DBDate Date data in the format yyyymmdd (DBTYPE_DBDATE). This maps to DateTime.

DBTime Time data in the format hhmmss (DBTYPE_DBTIME). This maps to TimeSpan.

DBTimeStamp Data and time data in the format yyyymmddhhmmss (DBTYPE_DBTIMESTAMP). This maps to DateTime.

Decimal A fixed precision and scale numeric value between -1038 -1 and 10 38 -1 (DBTYPE_DECIMAL). This maps to Decimal.

Double A floating point number within the range of -1.79E +308 through 1.79E +308 (DBTYPE_R8). This maps to Double.

Empty No value (DBTYPE_EMPTY). This maps to Empty.

Error A 32-bit error code (DBTYPE_ERROR). This maps to Exception.

Filetime A 64-bit unsigned integer representing the number of 100-nanosecond intervals since January 1, 1601 (DBTYPE_FILETIME). This maps to DateTime.

Guid A globally unique identifier (or GUID) (DBTYPE_GUID). This maps to Guid.

IDispatch A pointer to an IDispatch interface (DBTYPE_IDISPATCH). This maps to Object. Note This data type is not currently supported by ADO.NET. Usage may cause unpredictable results.

Integer A 32-bit signed integer (DBTYPE_I4). This maps to Int32.

IUnknown A pointer to an IUnknown interface (DBTYPE_UNKNOWN). This maps to Object. Note This data type is not currently supported by ADO.NET. Usage may cause unpredictable results.

LongVarBinary A long binary value (OleDbParameter only). This maps to an Array of type Byte.

LongVarChar A long string value (OleDbParameter only). This maps to String.

LongVarWChar A long null-terminated Unicode string value (OleDbParameter only). This maps to String. Numeric An exact numeric value with a fixed precision and scale (DBTYPE_NUMERIC). This maps to Decimal. PropVariant An automation PROPVARIANT (DBTYPE_PROP_VARIANT). This maps to Object.

Single A floating point number within the range of -3.40E +38 through 3.40E +38 (DBTYPE_R4). This maps to Single.

SmallInt A 16-bit signed integer (DBTYPE_I2). This maps to Int16.

TinyInt A 8-bit signed integer (DBTYPE_I1). This maps to SByte.

UnsignedBigInt A 64-bit unsigned integer (DBTYPE_UI8). This maps to UInt64.

UnsignedInt A 32-bit unsigned integer (DBTYPE_UI4). This maps to UInt32.

UnsignedSmallInt A 16-bit unsigned integer (DBTYPE_UI2). This maps to UInt16.

UnsignedTinyInt A 8-bit unsigned integer (DBTYPE_UI1). This maps to Byte.

VarBinary A variable-length stream of binary data (OleDbParameter only). This maps to an Array of type Byte. VarChar A variable-length stream of non-Unicode characters (OleDbParameter only). This maps to String.

Variant A special data type that can contain numeric, string, binary, or date data, as well as the special values Empty and Null (DBTYPE_VARIANT). This type is assumed if no other is specified. This maps to Object.

VarNumeric A variable-length numeric value (OleDbParameter only). This maps to Decimal.

VarWChar A variable-length, null-terminated stream of Unicode characters (OleDbParameter only). This maps to String.

WChar A null-terminated stream of Unicode characters (DBTYPE_WSTR). This maps to String.

Fuente:microsoft.net

Aun mas, con el ejemplo anterior el objeto COMMAND esta construido y preparado y cargado pero todavia no se manda desde el programa a la base de datos, es decir le faltan las siguientes tres propiedades, ejemplo;

orden.Connection.Open();

orden.ExecuteNonQuery();

orden.Connection.Close()

sencillo abrir la coneccion, mandar o ejecutar la instruccion y cerrar la coneccion.

OBJETOS DATAADAPTER Y DATASET:(dos por uno)

Con los objetos CONNECTION y COMMAND ya se pueden efectuar cualquiera de la operaciones SQL descritas( ya estudiaron su tutorial de SQL), el problema es que pasa con el usuario, cuando va a ver base de datos o mejor aun las tablas que estan en la base de datos en disco.

DATASET:- Es una copia en memoria(de la maquina cliente) de la base de datos( y todas sus tablas) que se encuentra en disco.

DATAADAPTER.- en princio es muy similar al objeto COMMAND es decir se usa para transportar instrucciones SQL a la base en disco, de hechos sus formatos e instrucciones son muy similares a los vistos para el objeto COMMAND, su diferencia principal es que dataadapter puede regresar datos, tablas o bases de datos completas y cargarlas en el DATASET, cosa que no se puede hacer con el objeto COMMAND, en particular muchos de los programas que se veran en temas posteriores solo usan los objetos CONNECTION, DATAADAPTER y DATASET.

Otra vez, dataadpater se especializa en transportar instrucciones sql a la base de datos en disco pero ademas se utiliza para cargar la tabla en memoria o dataset del cliente.

Ejemplo:

// abriendo la coneccion
coneccion=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\progfacil\\lauro\\mibase.mdb");
canal=new OleDbDataAdapter("select * from mitabla", coneccion);
tabla= new DataSet();
canal.Fill(tabla, "mitabla");

Como se observa en este ejemplo muy sencillo, el dataadapter(canal) esta funcionando de manera muy similar al primer ejemplo que se vio del objeto COMMAND, pero tengan la seguridad que tambien se pueden usar variables parametros y agregarles los dos tipos de parametros a este objeto dataadpater.

Observar que su propiedad FILL carga el DATASET(tabla) con una de las tablas en disco, recordar que en la base de datos puede contener muchas tablas.

Ademas esa propiedad FILL es equivalente a las tres ultimas instrucciones del objeto COMMAND, es decir open, executenonquery y close, mas facil verdad.

DATAREADER y DATASET:

Observar que tambien se usan en forma conjunta, primero es muy similar en uso y funcion que el objeto DATAADAPATER, la diferencia entre datareader y dataadapter es el tipo de base de datos con las cuales se pueden comunicar, dataadpater se especializan en bases de datos relacionales y datareader se especializa en archivos, que no se estudian en este curso.

EN general se han visto de manera sencilla los principales objetos ADO.ASP( connection, command, datareader, dataadapter, dataset), sin embargo la tabla o las tablas o la base de datos que se tiene en disco o sirviendola algun servidor de bases de datos, se ha quedado en la memoria de la maquina del cliente, ADO.NET ha terminado su trabajo y su funcion.

Para mandar el dataset a el browser se tendra que pasar a algun tipo de objeto visible que soporte el browser, los objetos que se pueden usar para mandar el dataset a pantalla son:

1.- COMPONENTE TABLE DE HTML(USADO EN EL CURSO DE CSHARP-CGI DE PROGRAMACIONFACIL.COM)

2.- COMPONENTE HTMLTABLE DE ASP

3.- COMPONENTE DATAGRID DE ASP.NET(USADO EN EL CURSO DE CSHARP-NET DE PROGRAMACIONFACIL.COM)

SINTESIS DE ADO NET

1. The common language runtime's managed data access APIs abstract data and present it in a consistent way regardless of its actual source (SQL Server, OLEDB, XML, and so on).

2. To give your page access to the classes you will need to perform SQL data access, you must import the System.Data and System.Data.SqlClient namespaces into your page.

3. Populating a dataset from a SQL query involves creating a SqlConnection, associating a SqlDataAdapter object with the connection that contains your query statement, and filling the dataset from the command.

4. The DataGrid control supports a DataSource property that takes an IEnumerable (or ICollection) type. You can set this to the result of a SQL query by assigning the DataSet's DefaultView property, which is of type DataView.

5. The SqlDataAdapter maintains a Parameters collection that can be used to replace variable identifiers (denoted by an ”@” in front of the name) with values.

6. When performing commands that do not require data to be returned, such as inserts, updates, and deletes, you use a SqlCommand instead of the SqlDataAdapter. The command is issued by calling an ExecuteNonQuery method, which returns the number of rows affected.

7. The SqlConnection must be explicitly opened when you use the SqlCommand (the SqlDataAdapter automatically handles opening the connection for you). Always remember to close the SqlConnection to the data model before the page finishes executing. If you do not close the connection, you migh inadvertantly exhaust the connection limit while waiting for the page instances to be released to garbage collection.

8. To allow rows to be edited, the DataGrid supports an integer EditItemIndex property, which indicates which row of the grid should be editable. When this property is set, the DataGrid renders the row at that index as text input boxes instead of simple labels.

9. The DataGrid exposes a DataKeyField property that you can set to the field name for the primary key. In the event handler wired to the UpdateCommand, you can retrieve the key name from the DataGrid's DataKeys collection.

10. Using BoundColumn controls in the DataGrid gives you complete control over the order of the columns, as well as their ReadOnly properties.

11. Using TemplateColumn controls in the DataGrid gives you complete control over the contents of the column.

12. The ButtonColumn control can be used to simply render a button control in each row for that column, which can be associated with an event.

13. A HyperLinkColumn can be added to the DataGrid's Columns collection, which supports navigating to another page when the link is clicked.

14. When the DataGrid's AllowSorting property is set to true, it renders hyperlinks for the column headers that fire a Sort command back to the grid. You set the OnSortCommand property of the DataGrid to the handler you want to call when the user clicks a column link.

15. The DataSet supports ReadXml, ReadXmlData, and ReadXmlSchema methods that take a FileStream as a parameter, which can be used to populate a DataSet from an XML file.

16. Using stored procedures can reduce the cost of performing heavy database operations in an application.

FUENTE: MICROSOFT NET

Politica de Privacidad