Desarrollo de Aplicaciones ASP .NET con Delphi 2006

By: Jose Castillo Reyes

Abstract: Este artículo ha usado una de las técnicas mas simples de acceso y lectura de base de datos usando BdpDataReader, así como el uso de nuevos controles para validar y presentar información de una manera rapida y sencilla con Delphi 2006.

    Introducción

ADO .NET es la tecnología mas moderna para el acceso a datos y forma parte del .NET Framework . Un concepto nuevo dentro de esta tecnología es la clase DataSet . Un DataSet a diferencia de un RecordSet de ADO, no solo permite contener mas de un conjunto de registros (DataTable) , sino que ademas pueden definir relaciones entre DataTables . ADO .NET contiene dos conjuntos de clases similares: Una genérica que puede usarse para acceder a las bases de datos de los proveedores OLE DB, y otro conjunto de clases optimizado para acceder a Microsoft SQL Server. Otro concepto Nuevo es el DataReader , que nos permitira acceder a datos de una manera mas rapida y sólo hacia adelante, es decir usted no puede regresar al registro anterior. Aquí, Borland introduce una nueva librería de clases (BDP .NET) para acceso a Bases de Datos Relacionales (BDP) que nos permitira conectarnos a diversas fuentes de datos como: InterBase , DB2 , Oracle , MS Access , y SQL Server/MSDE .

    Borland Data Provider .NET (BDP .NET)

Es un completo conjunto genérico de clases para acceso a datos en .NET. La mayoría de clases del .NET tienen su versión correspondiente en la BDP .NET . En nuestro artículo usaremos el BdpDataReader en lugar del DataReader , la que nos permitira que nuestro código pueda ser mas genérico con respecto a la base de datos. A continuación una breve descripción de algunos de los componentes del BDP usados en este artículo.
  • BdpCommand: Un contenedor de clase para una instrucción SQL. La clase puede administrar instrucciones directas SQL como: Select, Update, Delete o Insert y una llamada a un procedimiento almacenado.
  • BdpConnection: Una conexión a Base de Datos.
  • BdpDataReader: Un conjunto de registros de datos sólo hacia adelante.
  • BdpTransaction: Una transacción de base de datos.

    La Arquitectura del BDP

    Vamos a la Aplicación misma.

En la aplicación necesitaremos dos ASP .NET Page (paginas aspx). En una suministraremos los datos necesarios para realizar una consulta dinamica usando BdpDataReader y en la otra mostramos los resultados en un DataGrid. Durante el desarrollo del proyecto utilizaremos nuevos controles, nuevos objetos y nuevas características que estan disponibles en Delphi 2006. Así mismo usaremos la Base de Datos Employee.gdb que viene con Interbase 7.5. 1. Empecemos creando un nuevo proyecto ASP.NET Web Application. A éste proyecto lo llamaremos WebDemoOne. El asistente se encargara de crear el nuevo proyecto con los archivos necesarios. Es necesario agregar un nuevo ASP .NET Page. ( File | New | Other) al que llamaremos WebForm2.aspx. 2. En WebForm1.aspx, diseñaremos un formulario de ingreso de datos como se muestra en la figura de abajo. En ella utilizaremos dos nuevos controles de validación de datos: RequiredFieldValidator y ValidationSummary. Estos nuevos controles son muy necesarios cuando se quiere exigir la introducción de valores antes de que la consulta sea procesada en el servidor.

Hide image
Hide image
  • RequiredFieldValidator1, un control que servira para verificar que se ha ingresado el dato esperado.
  • ValidationSummary1, que se encargara de mostrar los mensajes personalizados del RequiredFieldValidator1.
3. El botón Consultar se encargara de enviar los parametros a la pagina WebForm2.aspx en la que construiremos la consulta SQL.

procedure TWebForm1.Button1_Click(sender: System.Object; e: System.EventArgs);
begin
 Cache['country']:= txtPais.Text;
 Response.Redirect('WebForm2.aspx');
end;
4. En WebForm2.aspx, colocamos un DataGrid y personalizamos su presentación usando el asistente de Clic-derecho en el DataGrid y seleccione Formato Automatico , luego añadimos las líneas de código que se encargaran de hacer todo el trabajo pesado. Como queremos que éste código se ejecute en el momento en que se carga la pagina, la añadiremos en el evento Load . No olvide incluir en la clausula uses los siguientes espacio de nombre: System.Data.Common, System.Data, Borland.Data.Provider, Borland.Vcl.SysUtils;

procedure TWebForm1.Page_Load(sender: System.Object; e: System.EventArgs);
var
 sPais: String;
 Trans : BdpTransaction;
 MyConeccion: BdpConnection;
 ConnStr, ConnOptions: String;
 Cadena: BdpCommand;
 MySql: String;
 CatalogoReader : BdpDataReader;
begin

ConnStr := 'Provider=Interbase;' +
       'assembly=Borland.Data.Interbase, Version=2.5.0.0,' +
       'Culture=neutral, PublicKeyToken=91d62ebb5b0d1b1b;'  +
       'vendorclient=gds32.dll;pooling=True;' +
       'grow on demand=True;database=localhost:C:\Archivos de programa\Archivos comunes\Borland Shared\Data\EMPLOYEE.GDB;' +
       'username=sysdba;max pool size=100;password=masterkey';

 ConnOptions := 'LoginPrompt=False;SQLDialect=3;RoleName=None;' +
         'CommitRetain=true;ServerCharSet=NONE;RollbackRetain=False;' +
         'TxnIsolation=ReadCommitted;WaitOnLocks=true';

 MyConeccion:= BdpConnection.Create(ConnStr);
 MyConeccion.ConnectionOptions:= ConnOptions;
 try
  MyConeccion.Open;
 except
   on e: exception do Response.Write(e.Message);
end;
 Trans := MyConeccion.BeginTransaction();

 sPais:= string(Cache.Get('country'));

 Mysql := 'select * from employee where job_country = '+ QuotedStr(sPais.ToUpper);

 Cadena := BdpCommand.Create(Mysql, MyConeccion, Trans);
 CatalogoReader := Cadena.ExecuteReader;
 DataGrid1.DataSource:=CatalogoReader;
 DataGrid1.DataBind;

 CatalogoReader.Close;
 MyConeccion.close;

 Trans.Commit;
 Trans.Free;
 MyConeccion.Free;

end;
5. En el código mostrado se han especificado las variables necesarias para crear el objeto de conección, de transacción, y de lectura de datos. La variable ConnStr especifica los valores necesarios para establecer la conección con la base de datos. Entre ellos: el tipo de proveedor de datos, el ensamblado a usar, la llave pública, si se usara o no el nuevo soporte a pool de conecciones , así como la ubicación física de la Base de Datos.

ConnStr := 'Provider=Interbase;' +
       'assembly=Borland.Data.Interbase, Version=2.5.0.0,' +
       'Culture=neutral, PublicKeyToken=91d62ebb5b0d1b1b;'  +
       'vendorclient=gds32.dll;pooling=True;' +
       'grow on demand=True;database=localhost:C:\Archivos de programa\Archivos comunes\Borland Shared\Data\EMPLOYEE.GDB;' +
       'username=sysdba;max pool size=100;password=masterkey';
6. Así también es necesario establecer el nivel de aislamiento a manejar en las transacciones:

ConnOptions := 'LoginPrompt=False;SQLDialect=3;RoleName=None;' +
         'CommitRetain=true;ServerCharSet=NONE;RollbackRetain=False;' +
         'TxnIsolation=ReadCommitted;WaitOnLocks=true';
7. El código siguiente se encarga de crear el objeto conección usando las variables anteriormente descritas, si en el proceso de creación hubiera algún error, se dispara un excepción y se muestra el correspondiente mensaje; en caso contrario se inicia una nueva Transacción.

MyConeccion:= BdpConnection.Create(ConnStr);
 MyConeccion.ConnectionOptions:= ConnOptions;
 try
  MyConeccion.Open;
 except
   on e: exception do Response.Write(e.Message);
end;
 Trans := MyConeccion.BeginTransaction();
8. Para construir la consulta SQL es necesario recuperar de la cache el valor de la variable country, con esto evitamos enviar los parametros por la URL. Almacenamos la consulta SQL en Mysql y la pasamos como parametro al crear el objeto Cadena. Para leer los datos recuperados invocamos al método ExecuteReader del objeto CatalogoReader que a su vez es una instancia de BdpDataReader . Para mostrar los resultados del BdpDataReader en la pagina, vamos a enlazar el DataGrid con CatalogoReader mediante la propiedad DataSource .

sPais:= string(Cache.Get('country'));

 Mysql := 'select * from employee where job_country = '+ QuotedStr(sPais.ToUpper);

 Cadena := BdpCommand.Create(Mysql, MyConeccion, Trans);
 CatalogoReader := Cadena.ExecuteReader;
 DataGrid1.DataSource:=CatalogoReader;
 DataGrid1.DataBind;

 CatalogoReader.Close;
 MyConeccion.close;

 Trans.Commit;
9. Es necesario especificar DataBind para que los datos sean permanentes en el control DataGrid . Luego, cerramos el BdpDataReader y el objeto conección. Finalmente confirmamos la transacción.

    Resumen:

Este artículo ha usado una de las técnicas mas simples de acceso y lectura de base de datos usando BdpDataReader , así como el uso de nuevos controles para validar y presentar información de una manera rapida y sencilla con Delphi 2006.

Server Response from: ETNASC03