Sie sind auf Seite 1von 29

Requisitos

En la lista siguiente se describe el hardware, el software, la infraestructura de red y los Service Pack recomendados que necesitar:

Microsoft Visual Studio .NET Servicios de Microsoft Internet Information Server (IIS) 5.0 o posterior Microsoft SQL Server

Volver al principio

Crear una aplicacin ASP.NET utilizando C# .NET


1. 2. Abra Visual Studio .NET. Cree una nueva aplicacin Web ASP.NET, y especifique el nombre y la ubicacin.

Volver al principio

Configurar la seguridad en el archivo Web.config


En esta seccin se muestra cmo agregar y modificar las secciones de configuracin <authentication> y <authorization> para configurar la aplicacin ASP.NET de manera que utilice autenticacin basada en formularios. 1. 2. 3. En el Explorador de soluciones, abra el archivo Web.config. Cambie el modo de autenticacin a Forms. Inserte la etiqueta <Forms> y rellene los atributos adecuados. (Para obtener ms informacin acerca de estos atributos, consulte la documentacin de MSDN o la documentacin del Tutorial rpido que se muestra en la seccin REFERENCIAS.) Copie el cdigo siguiente y haga clic en Pegar como HTML en el men Edicin para pegar el cdigo en la seccin <authentication> del archivo:

4. <authentication mode="Forms"> 5. 6. <forms name=".ASPXFORMSDEMO" loginUrl="logon.aspx" protection="All" path="/" timeout="30" />

7. </authentication>

8.

Deniegue el acceso al usuario annimo en la seccin <authorization> de la manera siguiente:

9. <authorization> 10. 11. <deny users ="?" /> <allow users = "*" />

12. </authorization>

Volver al principio

Crear una tabla de base de datos de ejemplo para almacenar detalles de los usuarios
En esta seccin se muestra cmo crear una base de datos de ejemplo para almacenar el nombre de usuario, la contrasea y la funcin para los usuarios. Necesitar la columna de funcin si desea almacenar las funciones de usuario en la base de datos e implementar la seguridad basada en funciones. 1. 2. En el men Inicio, haga clic en Ejecutar y escriba notepad para abrir el Bloc de notas. Resalte el cdigo de secuencia de comandos SQL siguiente, haga clic con el botn secundario del mouse (ratn) en el mismo y, a continuacin, haga clic en Copiar. En el Bloc de notas, haga clic en Pegar en el men Edicin para pegar el cdigo siguiente:

3. if exists (select * from sysobjects where id = 4. object_id(N'[dbo].[Users]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 5. drop table [dbo].[Users] 6. GO 7. CREATE TABLE [dbo].[Users] ( 8. 9. 10. [uname] [varchar] (15) NOT NULL , [Pwd] [varchar] (25) NOT NULL , [userRole] [varchar] (25) NOT NULL ,

11. ) ON [PRIMARY] 12. GO 13. ALTER TABLE [dbo].[Users] WITH NOCHECK ADD 14. 15. 16. 17. 18. GO 19. 20. INSERT INTO Users values('user1','user1','Manager') 21. INSERT INTO Users values('user2','user2','Admin') 22. INSERT INTO Users values('user3','user3','User') 23. GO ) CONSTRAINT [PK_Users] PRIMARY KEY ( [uname] ON [PRIMARY] NONCLUSTERED

24. Guarde el archivo como Users.sql. 25. En el equipo con Microsoft SQL Server, abra Users.sql en el Analizador de consultas. En la lista de bases de datos, haga clic en pubs y ejecute la secuencia de comandos. Esto crear una tabla de usuarios de ejemplo y llenar la tabla de la base de datos Pubs que se utilizar con esta aplicacin de ejemplo. Volver al principio

Crear una pgina Logon.aspx


1. 2. 3. Agregue un nuevo formulario Web Forms al proyecto denominado Logon.aspx. Abra la pgina Logon.aspx en el editor y cambie a la vista HTML. Copie el cdigo siguiente y utilice la opcin Pegar como HTML del men Edicin para insertar el cdigo entre las etiquetas <form>:

4. <h3> 5. <font face="Verdana">Logon Page</font>

6. </h3> 7. <table> 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. </tr> <tr> <td>Password:</td> <td><input id="txtUserPass" type="password" runat="server"></td> <td><ASP:RequiredFieldValidator ControlToValidate="txtUserPass" Display="Static" ErrorMessage="*" runat="server" ID="vUserPass" /> </td> </tr> <tr> <td>Persistent Cookie:</td> <td><ASP:CheckBox id="chkPersistCookie" runat="server" autopostback="false" /></td> <tr> <td>Email:</td> <td><input id="txtUserName" type="text" runat="server"></td> <td><ASP:RequiredFieldValidator ControlToValidate="txtUserName" Display="Static" ErrorMessage="*" runat="server" ID="vUserName" /></td>

26. 27.

<td></td> </tr>

28. </table> 29. <input type="submit" Value="Logon" runat="server" ID="cmdLogin"><p></p> 30. <asp:Label id="lblMsg" ForeColor="red" Font-Name="Verdana" FontSize="10" runat="server" />

Este formulario Web Forms se utiliza para presentar un formulario de inicio de sesin a los usuarios, de manera que puedan proporcionar su nombre de usuario y su contrasea para iniciar sesin en la aplicacin. 31. Cambie a la vista Diseo y guarde la pgina. Volver al principio

Codificar el controlador de eventos para que valide las credenciales de usuario


En esta seccin se presenta el cdigo que se coloca en la pgina de cdigo subyacente (Logon.aspx.cs). 1. 2. Haga doble clic en Logon para abrir el archivo Logon.aspx.cs. Importe los espacios de nombres necesarios al archivo de cdigo subyacente:

3. using System.Data.SqlClient; 4. using System.Web.Security;

5.

Cree una funcin ValidateUser para validar las credenciales de usuario examinando la base de datos. (Asegrese de que cambia la cadena de conexin para sealar a su base de datos.)

6. private bool ValidateUser( string userName, string passWord ) 7. { 8. SqlConnection conn; 9. SqlCommand cmd; 10. 11. 12. 13. // Check for invalid userName. // userName must not be null and must be between 1 and 15 characters. string lookupPassword = null;

14.

if ( (

null == userName ) || ( 0 == userName.Length ) || (

userName.Length > 15 ) ) 15. 16. { System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of userName failed." ); 17. 18. 19. 20. 21. // Check for invalid passWord. // passWord must not be null and must be between 1 and 25 characters. 22. if ( ( null == passWord ) || ( 0 == passWord.Length ) || ( } return false;

passWord.Length > 25 ) ) 23. 24. { System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of passWord failed." ); 25. 26. 27. 28. 29. 30. try { // Consult with your SQL Server administrator for an appropriate connection 31. 32. // string to use to connect to your local SQL Server. conn = new SqlConnection( "server=localhost;Integrated Security=SSPI;database=pubs" ); 33. 34. 35. // Create SqlCommand to select pwd field from users table given supplied userName. 36. cmd = new SqlCommand( "Select pwd from users where uname=@userName", conn ); 37. ); 38. 39. cmd.Parameters["@userName"].Value = userName; cmd.Parameters.Add( "@userName", SqlDbType.VarChar, 25 conn.Open(); } return false;

40.

// Execute command and fetch pwd field into lookupPassword string.

41. 42. 43. 44. 45. 46. 47. 48. 49. 50. caller. 51. }

lookupPassword = (string) cmd.ExecuteScalar();

// Cleanup command and connection objects. cmd.Dispose(); conn.Dispose();

catch ( Exception ex ) { // Add error handling here for debugging. // This error message should not be sent back to the

System.Diagnostics.Trace.WriteLine( "[ValidateUser] Exception " + ex.Message );

52. 53. 54. 55. 56. 57.

// If no password found, return false. if ( null == lookupPassword ) { // You could write failed login attempts here to event log for additional security.

58. 59. 60. 61. }

return false;

// Compare lookupPassword and input passWord, using a casesensitive comparison.

62. ); 63. 64. }

return ( 0 == string.Compare( lookupPassword, passWord, false )

65. Puede utilizar uno de dos mtodos posibles para generar la cookie de autenticacin de formularios y redirigir al usuario a una pgina apropiada en el evento cmdLogin_ServerClick. Se proporciona el cdigo de ejemplo para ambos escenarios. Utilice cualquiera de ellos segn sea necesario.

Llame al mtodo RedirectFromLoginPage para generar automticamente la cookie de autenticacin de formularios y redirigir al usuario a una pgina apropiada en el evento cmdLogin_ServerClick:

private void cmdLogin_ServerClick(object sender, System.EventArgs e)

o o o o o o o

{ if (ValidateUser(txtUserName.Value,txtUserPass.Value) ) FormsAuthentication.RedirectFromLoginPage(txtUserName.Value, chkPersistCookie.Checked); else Response.Redirect("logon.aspx", true); }

Genere el vale de autenticacin, cfrelo, cree una cookie, agrguela a la respuesta y redirija al usuario. Esto le ofrece ms control sobre cmo crear la cookie. Tambin puede incluir datos personalizados junto con FormsAuthenticationTicket en este caso.

private void cmdLogin_ServerClick(object sender, System.EventArgs e)

o o o o o o o

{ if (ValidateUser(txtUserName.Value,txtUserPass.Value) ) { FormsAuthenticationTicket tkt; string cookiestr; HttpCookie ck; tkt = new FormsAuthenticationTicket(1, txtUserName.Value, DateTime.Now,

DateTime.Now.AddMinutes(30), chkPersistCookie.Checked, "your custom data");

o o

cookiestr = FormsAuthentication.Encrypt(tkt); ck = new HttpCookie(FormsAuthentication.FormsCookieName, cookiestr);

o o o o

if (chkPersistCookie.Checked) ck.Expires=tkt.Expiration; ck.Path = FormsAuthentication.FormsCookiePath; Response.Cookies.Add(ck);

o o o o o o o o o o } } else Response.Redirect("logon.aspx", true); string strRedirect; strRedirect = Request["ReturnUrl"]; if (strRedirect==null) strRedirect = "default.aspx"; Response.Redirect(strRedirect, true);

66. Asegrese de que el cdigo siguiente se agrega al mtodo InitializeComponent en el cdigo generado por el Diseador de Web Forms:

67. this.cmdLogin.ServerClick += new System.EventHandler(this.cmdLogin_ServerClick);

Volver al principio

Crear una pgina Default.aspx


En esta seccin se crea una pgina de prueba a la que se redirige a los usuarios despus de autenticarse. Si los usuarios van a esta pgina sin iniciar sesin primero en la aplicacin, se les redirige a la pgina de inicio de sesin. 1. 2. Cambie el nombre de la pgina WebForm1.aspx existente como Default.aspx y brala en el editor. Cambie a la vista HTML y copie el cdigo siguiente entre las etiquetas <form>:

3. <input type="submit" Value="SignOut" runat="server" id="cmdSignOut">

Este botn se utiliza para cerrar la sesin de autenticacin de formularios. 4. 5. Cambie a la vista Diseo y guarde la pgina. Importe los espacios de nombres necesarios al archivo de cdigo subyacente:

6. using System.Web.Security;

7.

Haga doble clic en SignOut para abrir la pgina de cdigo subyacente (Default.aspx.cs) y copie el cdigo siguiente al controlador de eventos cmdSignOut_ServerClick:

8. private void cmdSignOut_ServerClick(object sender, System.EventArgs e) 9. { 10. 11. 12. } FormsAuthentication.SignOut(); Response.Redirect("logon.aspx", true);

13. Asegrese de que el cdigo siguiente se agrega al mtodo InitializeComponent en el cdigo generado por el Diseador de Web Forms:

14. this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick);

15. Guarde y compile el proyecto. Ahora puede utilizar la aplicacin. Volver al principio

Notas adicionales
Quizs desee almacenar las contraseas de manera segura en una base de datos. Puede emplear la funcin de utilidad de la clase FormsAuthentication denominada HashPasswordForStoringInConfigFile para cifrar las contraseas antes de almacenarlas en la base de datos o en el archivo de configuracin.

Quizs desee almacenar la informacin de conexin de SQL en el archivo de configuracin (Web.config) de forma que pueda modificarla fcilmente si es necesario. Quizs desee considerar la posibilidad de agregar cdigo para impedir el inicio de sesin de los piratas informticos que intentan utilizar diferentes combinaciones de contraseas. Por ejemplo, puede incluir lgica que slo acepte dos o tres intentos de inicio de sesin. Si el usuario no puede iniciar sesin en un cierto nmero de intentos, quizs desee establecer un indicador en la base de datos para no permitir que ese usuario inicie sesin hasta que no vuelva a habilitar su cuenta visitando una pgina diferente o llamando a su lnea de soporte tcnico. Adems, debe agregar un control de errores apropiado donde sea necesario.

Puesto que el usuario se identifica segn la cookie de autenticacin, quizs desee utilizar Capa de sockets seguros (SSL) en esta aplicacin para que nadie pueda interceptar la cookie de autenticacin y cualquier otra informacin valiosa que se transmita.

La autenticacin basada en formularios requiere que su cliente acepte o habilite las cookies en su explorador. El parmetro timeout de la seccin de configuracin <authentication> controla el intervalo en el que se vuelve a generar la cookie de autenticacin. Puede elegir un valor que proporcione mejor rendimiento y seguridad.

Algunos servidores proxy y memorias cach intermedios de Internet pueden almacenar en cach respuestas del servidor Web que contienen encabezados Set-Cookie, que se devuelven a un usuario diferente. Puesto que la autenticacin basada en formularios utiliza una cookie para autenticar a los usuarios, esto puede hacer que los usuarios suplanten accidentalmente (o intencionadamente) a otro usuario recibiendo una cookie de un servidor proxy o una memoria cach intermedios que no estaba dirigida originalmente a ellos.

Volver al principio Referencias

Para obtener ms informacin acerca de cmo implementar la autenticacin simple basada en formularios que utiliza la seccin <credentials> para almacenar usuarios y contraseas, consulte el ejemplo del Tutorial rpido de ASP.NET GotDotNet siguiente: Forms-Based Authentication (Autenticacin basada en formularios) http://samples.gotdotnet.com/quickstart/aspplus/default.aspx?url=/quickstart/aspplus/doc/formsauth.aspx Para obtener ms informacin acerca de cmo implementar la autenticacin basada en formularios que utiliza un archivo XML para almacenar usuarios y contraseas, consulte el tema siguiente en la documentacin del Kit de desarrollo de software (SDK) de .NET Framework: Forms Authentication Using An XML Users File (Autenticacin de formularios utilizando un archivo XML Users) http://msdn.microsoft.com/library/default.asp?url=/library/enus/cpguide/html/cpconcookieauthenticationusinganxmlusersfile.asp Para obtener ms informacin acerca de la seguridad de las aplicaciones Web ASP.NET, consulte la siguiente documentacin de la Gua del desarrollador de Microsoft .NET Framework: ASP.NET Web Application Security (Seguridad de aplicaciones Web ASP.NET) http://msdn2.microsoft.com/en-us/library/330a99hc(vs.71).aspx Para obtener ms informacin acerca del espacio de nombres System.Web.Security, consulte la siguiente documentacin de referencia de Microsoft .NET Framework: System.Web.Security Namespace (Espacio de nombres System.Web.Security) http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWebSecurity.asp Para obtener ms informacin acerca de la configuracin de ASP.NET, consulte los siguientes artculos de la Gua del desarrollador de Microsoft .NET Framework:

ASP.NET Configuration (Configuracin de ASP.NET) http://msdn2.microsoft.com/en-us/library/aa719558(VS.71).aspx

ASP.NET Configuration Sections (Secciones de configuracin de ASP.NET) http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpgrfaspnetconfigurationsections.asp Para obtener informacin acerca de las directrices de seguridad de ASP.NET, consulte la siguiente nota de producto de MSDN: Authentication in ASP.NET: .NET Security Guidance (Autenticacin en ASP.NET: consejos sobre seguridad de .NET) http://msdn2.microsoft.com/en-us/library/ms978378.aspx Para obtener ms informacin general acerca de ASP.NET, visite el siguiente grupo de noticias de MSDN: http://www.microsoft.com/spanish/msdn/gruposnoticias.asp

En esta primera etapa solo considerar la creacin del cdigo para accesar a una pgina donde ser necesario utilizar un nombre de usuario y un password. No har ninguna modificacin al Web.Config, ms adelante lo ocupar en otro ejemplo. Comencemos. Vamos a crear la siguiente pgina Abriendo un proyecto nuevo para WebSite

Debe incluir dos etiquetas, dos cajas de texto y un botn. Voy a crear una tabla que se llame usuarios, que cuente con dos campos usr y pwd, los cuales ser de tipo nvarchar, dentro de una Base de Datos que llamare EST, una vez que cree la Base de Datos, la tabla, los campos y agregue algunos registros, voy a proceder a crear un prodecimiento almacenado que ser capaz de poder identificar por mi, si el usuario y el password son correctos, la manera es muy sencilla, solo contemos mediante una consulta de SQL si existe un registros con el usuario y el password que ingresamos, si devuelve 1, el usuario podra entrar, si no, habra que indicarle que algo escribio mal. El procedimiento almacenado se llama verifica, y queda de la siguiente manera:

Podemos probar el procedimiento almacenado que acabamos de crear, dandole un click derecho sobre el, y seleccionando la opcin Execute. Vamos a crear ahora el cdigo para el botn, para este paso, vamos a utlizar SQLConnection y SQLCommand, ambos pertenecen a la coleccin de nombres de SQLCLient, para ellos es necesario agregarla en el encabezado del programa de la siguiente manera: using System.Data.SqlClient; El cdigo del botn quedara de la siguiente manera:

Oberven en el cdigo que utilizo dos WEBform ms, si el valor que devuelve la consulta hecha a tras del proceimiento almacenado es 1, se ir a la pgina de Bienvenida.aspx, en caso contrario le indicar en Error.aspx, que se escribio incorrectamente el nombre usuario y contrasea, para ello, se debe agregar estod dos WebForm ms.

NOTA: Para poder logar que se enmascare con *(asteriscos) el tipeo del password, es necesario que selecciones la caja de texto a utilizar, y posteriormente en propiedades en la opcin TextMode elegir : Password Espero que les haya sido de mucha utilidad a todos, un saludo desde Mxico a todos los que han posteado sus comentarios desde el resto de nuestro precioso pas, eso motiva mucho. Un fuerte abrazo a mis lectores de America Latina y Espaa, la verdad sus comentarios alienta a seguir trabajando con ms enfasis, y a todos aquellos que han usado este medio para poner cosas ofensivas, la verdad mejor busquen otro sitio, no me gustan esos comentarios, ponganse a trabajar, y utilicen mejor el Espaol que es una lengua precio sa, en lugar de escribir puras tonterias, aqui tratamos de compartir conocimiento, desarrollemos un planeta mejor.

Un Stored Procedure o procedimiento almacenado, es algo asi como una sentencia SQL que se crea dentro de la base de datos. Pero creo que si estn leyendo esto, es porque ya saben lo que es un Stored Procedure, y simplemente quieren saber como ejecutarlo desde una pgina WEB. Los que no sepan que es un Stored Procedure, les recomiendo buscar por otro lado. Bueno, los Stored Procedure tienen un nombre, y es lo que utilizaremos para llamarlos. Es muy simple y facil.. Ejecucion de un Stored Procedure sin ningun parmetro y sin RecordSet (poco usual, pero posible) <% 'Creamos la conexion... Set oConn = Server.CreateObject("ADODB.Connection") oConn.Open "DRIVER de conexion" 'Aqui llamamos al ST en este caso llamado procedimiento oConn.Execute "EXEC procedimiento" oConn.Close Set oConn = Nothing %> Ejecucion de un Stored Procedure con parmetros <% 'Creamos la conexion... Set oConn = Server.CreateObject("ADODB.Connection") oConn.Open "DRIVER de conexion" 'Separar los parmetros con coma (,) oConn.Execute "EXEC procedimiento param1, param2" oConn.Close Set oConn = Nothing %> Ejecucion de un Stored Procedure con parmetros, recibiendo los datos en un Objeto RecordSet <% 'Creamos la conexion... Set oConn = Server.CreateObject("ADODB.Connection") oConn.Open "DRIVER de conexion" Set RS = Server.CreateObject("ADODB.RecordSet") 'Separar los parmetros con coma (,) RS.Open "EXEC procedimiento param1, param2", oConn ' ... ' Trabajamos con el RS ' ... RS.Close

Set RS = Nothing oConn.Close Set oConn = Nothing %>

En este artculo paso a paso se usa el objeto DataReader para recuperar datos de un procedimiento almacenado de Oracle. Puede usar el objeto DataReader para recuperar una secuencia de datos de avance de slo lectura de una base de datos. Al usar el objeto DataReader puede aumentar el rendimiento de la aplicacin y reducir la carga del sistema, ya que slo se guarda una fila en memoria. Volver al principio

Requisitos
En la lista siguiente se describe el hardware, el software, la infraestructura de red y los Service Pack recomendados que se necesitarn:

Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server o Windows NT 4.0 Server Microsoft Visual Studio .NET

En el presente artculo se da por supuesto que est familiarizado con los temas siguientes:

Visual C# .NET Fundamentos y sintaxis de ADO.NET

Volver al principio

Crear las tablas de Oracle


En este ejemplo se usan tablas definidas en el esquema Scott/Tiger de Oracle. El esquema Scott/Tiger de Oracle se incluye con la instalacin predeterminada de Oracle.

Si este esquema no existe, tiene que ejecutar la tabla siguiente e insertar secuencias de comandos para las tablas:

CREATE TABLE DEPT (DEPTNO NUMBER(2,0) NOT NULL, DNAME VARCHAR2(14) NULL, LOC VARCHAR2(13) NULL, PRIMARY KEY (DEPTNO) );

INSERT INTO Dept VALUES(11,'Sales','Texas'); INSERT INTO Dept VALUES(22,'Accounting','Washington'); INSERT INTO Dept VALUES(33,'Finance','Maine');

CREATE TABLE EMP (EMPNO NUMBER(4,0) NOT NULL, ENAME VARCHAR2(10) NULL, JOB VARCHAR2(9) NULL, MGR NUMBER(4,0) NULL, SAL NUMBER(7,2) NULL, COMM NUMBER(7,2) NULL, DEPTNO NUMBER(2,0) NULL, FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO), PRIMARY KEY (EMPNO) );

INSERT INTO Emp VALUES(123,'Bob','Sales',555,35000,12,11); INSERT INTO Emp VALUES(321,'Sue','Finance',555,42000,12,33); INSERT INTO Emp VALUES(234,'Mary','Account',555,33000,12,22);
Volver al principio

Crear los paquetes de Oracle


Cree el paquete de Oracle siguiente en el servidor Oracle:

CREATE OR REPLACE PACKAGE curspkg_join AS TYPE t_cursor IS REF CURSOR ; Procedure open_join_cursor1 (n_EMPNO IN NUMBER, io_cursor IN OUT t_cursor); END curspkg_join; /
Cree el siguiente cuerpo de paquete de Oracle en el servidor Oracle:

CREATE OR REPLACE PACKAGE BODY curspkg_join AS Procedure open_join_cursor1 (n_EMPNO IN NUMBER, io_cursor IN OUT t_cursor) IS v_cursor t_cursor; BEGIN IF n_EMPNO <> 0 THEN OPEN v_cursor FOR

SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND EMP.EMPNO = n_EMPNO;

ELSE OPEN v_cursor FOR SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;

END IF; io_cursor := v_cursor; END open_join_cursor1; END curspkg_join; /


Volver al principio

Crear la aplicacin de Visual C# .NET


1. Cree un nuevo proyecto de aplicacin para Windows de Visual C#. Se agregar Form1 al proyecto de manera predeterminada. 2. Agregue el siguiente cdigo al principio de la ventana de cdigo:

using System.Data.OleDb;
3. Agregue el cdigo siguiente al evento Form_Load de Form1:

4. OleDbConnection Oraclecon = new OleDbConnection("Provider=MSDAORA.1;Password=tiger;" 5. Info=True"); 6. Oraclecon.Open(); 7. OleDbCommand myCMD = new OleDbCommand 8. ("{call curspkg_join.open_join_cursor1(?, {resultset 0, io_cursor})}", Oraclecon); 9. myCMD.Parameters.Add("ID", OleDbType.Numeric, 4).Value = 0; + "User ID=scott;Data Source=OracleServer;Persist Security

10. OleDbDataReader myReader; 11. myReader = myCMD.ExecuteReader(); 12. int x; 13. int count; 14. count = 0; 15. while (myReader.Read()) 16. 17. { 18. 19. 20. 21. 22. 23. 24. } 25. 26. 27. MessageBox.Show(count + " Rows Returned."); 28. myReader.Close(); Oraclecon.Close();
29. Modifique la cadena OleDbConnection de acuerdo con su entorno. 30. Presione la tecla F5 para compilar y ejecutar la aplicacin. Tenga en cuenta que los datos del procedimiento almacenado de Oracle se incluyen en la ventana Depuracin y aparece un cuadro de mensajes que muestra el nmero de filas. Volver al principio

for (x = 0; x <= myReader.FieldCount - 1; x++) Console.Write(myReader.GetValue(x) + " ");

Console.WriteLine(); count += 1;

Informacin adicional
Tenga en cuenta que el cdigo recorre el elemento DataReader:

while (myReader.Read())
Esto se debe a que DataReader slo lee una lnea cada vez.

Representa un conjunto de comandos de datos y una conexin a una base de datos que se utilizan para rellenar el DataSet y actualizar la base de datos. Esta clase no se puede heredar. Espacio de nombres: System.Data.OracleClient Ensamblado: System.Data.OracleClient (en system.data.oracleclient.dll)

Sintaxis

C# C++ VB Copiar

'Declaration Public NotInheritable Class OracleDataAdapter Inherits DbDataAdapter Implements IDbDataAdapter, IDataAdapter, ICloneable 'Usage Dim instance As OracleDataAdapter

J# Copiar

public final class OracleDataAdapter extends DbDataAdapter implements IDbDataAdapter, IDataAdapter, ICloneable
JScript Copiar

public final class OracleDataAdapter extends DbDataAdapter implements IDbDataAdapter, IDataAdapter, ICloneable

Comentarios

OracleDataAdapter sirve de puente entre un objeto DataSet y una base de datos para recuperar y guardar datos. OracleDataAdapter proporciona este puente utilizando el mtodo Fill para cargar datos de la base de datos en DataSet y utilizando el mtodo Update para devolver al origen de datos los cambios realizados en DataSet. Cuando OracleDataAdapter rellene un objeto DataSet, crear las tablas y columnas necesarias para los datos devueltos si todava no existen. Sin embargo, la informacin de clave principal no se incluir en el esquema creado implcitamente a menos que la propiedad MissingSchemaAction se establezca en AddWithKey. Tambin se puede hacer que OracleDataAdapter cree el esquema de DataSet, incluida la informacin de clave principal, antes de rellenarlo de datos mediante el mtodo FillSchema. Para obtener ms informacin, vea Agregar restricciones existentes a DataSet.

Nota
De forma predeterminada, los campos numricos importados a un objeto DataTable con Fill se asignan a objetos OracleNumber. Es posible desbordar el objeto OracleNumber, provocando que se inicie una excepcin de Oracle, si se importa un valor numrico no entero que sea demasiado grande o demasiado preciso para las limitaciones de precisin de OracleNumber. Para obtener ms informacin, vea la descripcin de OracleNumber.

OracleDataAdapter tambin incluye las propiedades SelectCommand, InsertCommand, DeleteCommand, UpdateCommand y TableMappings para facilitar la carga y la actualizacin de datos. El proveedor de datos de .NET Framework para Oracle no admite instrucciones SQL por lotes. Sin embargo, permite utilizar varios parmetros de salida REF CURSOR para rellenar un objeto DataSet, cada uno en su propia DataTable. Debe definir los parmetros, marcarlos como parmetros de salida e indicar que son tipos de datos REF CURSOR. Tenga en cuenta que no se puede utilizar el mtodo Update cuando OracleDataAdapter se rellena con parmetros REF CURSOR devueltos por un procedimiento almacenado, porque Oracle no proporciona la informacin necesaria para determinar cules son los nombres de tabla y de columna al ejecutar la instruccin SQL. En el siguiente ejemplo de C# se supone que se ha creado este procedimiento almacenado. Cree el siguiente paquete de Oracle en el servidor Oracle. other

Copiar

CREATE OR REPLACE PACKAGE CURSPKG AS TYPE T_CURSOR IS REF CURSOR; PROCEDURE OPEN_ONE_CURSOR (N_EMPNO IN NUMBER, IO_CURSOR OUT T_CURSOR); PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR, DEPTCURSOR OUT T_CURSOR); END CURSPKG; /
Cree el siguiente cuerpo del paquete de Oracle en el servidor Oracle. other Copiar

CREATE OR REPLACE PACKAGE BODY CURSPKG AS PROCEDURE OPEN_ONE_CURSOR (N_EMPNO IN NUMBER, IO_CURSOR OUT T_CURSOR) IS V_CURSOR T_CURSOR; BEGIN IF N_EMPNO <> 0 THEN OPEN V_CURSOR FOR SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND EMP.EMPNO = N_EMPNO; ELSE OPEN V_CURSOR FOR SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME

FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO; END IF; IO_CURSOR := V_CURSOR; END OPEN_ONE_CURSOR; PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR, DEPTCURSOR OUT T_CURSOR) IS V_CURSOR1 T_CURSOR; V_CURSOR2 T_CURSOR; BEGIN OPEN V_CURSOR1 FOR SELECT * FROM EMP; OPEN V_CURSOR2 FOR SELECT * FROM DEPT; EMPCURSOR := V_CURSOR1;

DEPTCURSOR := V_CURSOR2; END OPEN_TWO_CURSORS; END CURSPKG; /


En el siguiente ejemplo de C# se muestra cmo se puede obtener informacin de la tabla y la columna mediante el procedimiento almacenado. C# Copiar

// GetConnectionString() returns a connection string for // the data source.

string connString = GetConnectionString(); DataSet ds = new DataSet(); OracleConnection conn = new OracleConnection(connString);

OracleCommand cmd = conn.CreateCommand();

cmd.CommandText = "CURSPKG.OPEN_TWO_CURSORS"; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("EMPCURSOR", OracleType.Cursor).Direction = ParameterDirection.Output; cmd.Parameters.Add("DEPTCURSOR", OracleType.Cursor).Direction = ParameterDirection.Output;

OracleDataAdapter da = new OracleDataAdapter(cmd); da.TableMappings.Add("Table", "Emp"); da.TableMappings.Add("Table1", "Dept"); da.Fill(ds);

ds.Relations.Add("EmpDept", ds.Tables["Dept"].Columns["Deptno"], ds.Tables["Emp"].Columns["Deptno"], false);


En el siguiente ejemplo de Visual Basic se muestra cmo utilizar OracleDataAdapter para rellenar un DataSet mediante REF CURSOR de Oracle. En estos ejemplos se utilizan tablas definidas en el esquema Scott/Tiger de Oracle y se requiere el siguiente paquete PL/SQL y, concretamente, el cuerpo del paquete. Para utilizar los ejemplos, debe crearlos en el servidor. Cree el siguiente paquete de Oracle en el servidor Oracle. other Copiar

CREATE OR REPLACE PACKAGE CURSPKG AS TYPE T_CURSOR IS REF CURSOR; PROCEDURE OPEN_ONE_CURSOR (N_EMPNO IN NUMBER, IO_CURSOR OUT T_CURSOR); PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR,

DEPTCURSOR OUT T_CURSOR); END CURSPKG; /


Cree el siguiente cuerpo del paquete de Oracle en el servidor Oracle. other Copiar

CREATE OR REPLACE PACKAGE BODY CURSPKG AS PROCEDURE OPEN_ONE_CURSOR (N_EMPNO IN NUMBER, IO_CURSOR OUT T_CURSOR) IS V_CURSOR T_CURSOR; BEGIN IF N_EMPNO <> 0 THEN OPEN V_CURSOR FOR SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND EMP.EMPNO = N_EMPNO; ELSE OPEN V_CURSOR FOR SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO; END IF; IO_CURSOR := V_CURSOR; END OPEN_ONE_CURSOR; PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR,

DEPTCURSOR OUT T_CURSOR) IS V_CURSOR1 T_CURSOR; V_CURSOR2 T_CURSOR; BEGIN OPEN V_CURSOR1 FOR SELECT * FROM EMP; OPEN V_CURSOR2 FOR SELECT * FROM DEPT; EMPCURSOR := V_CURSOR1;

DEPTCURSOR := V_CURSOR2; END OPEN_TWO_CURSORS; END CURSPKG; /


En este ejemplo de Visual Basic se ejecuta un procedimiento almacenado PL/SQL que devuelve dos parmetros REF CURSOR y se rellena un DataSet con las filas devueltas. VB Copiar

' GetConnectionString() returns a connection string for ' the data source.

Dim connString As New String(GetConnectionString()) Dim ds As New DataSet() Dim conn As New OracleConnection(connString) Dim cmd As OracleCommand = conn.CreateCommand()

cmd.CommandText = "CURSPKG.OPEN_TWO_CURSORS" cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("EMPCURSOR", OracleType.Cursor).Direction = _

ParameterDirection.Output cmd.Parameters.Add("DEPTCURSOR", OracleType.Cursor).Direction = _ ParameterDirection.Output

Dim da As New OracleDataAdapter(cmd) da.TableMappings.Add("Table", "Emp") da.TableMappings.Add("Table1", "Dept") da.Fill(ds)

ds.Relations.Add("EmpDept", ds.Tables("Dept").Columns("Deptno"), _ ds.Tables("Emp").Columns("Deptno"), False)


Despus de utilizar OracleDataAdapter para realizar una operacin Fill o FillSchema, la propiedad DataColumn.ReadOnly devuelve siempre el valor false, independientemente de si se puede o no actualizar una columna, ya que el servidor Oracle no proporciona esta informacin.

Jerarqua de herencia

System.Object System.MarshalByRefObject System.ComponentModel.Component System.Data.Common.DataAdapter System.Data.Common.DbDataAdapter System.Data.OracleClient.OracleDataAdapter

Seguridad para subprocesos

Los miembros estticos pblicos (Shared en Visual Basic) de este tipo son seguros para la ejecucin de subprocesos. No se garantiza que los miembros de instancias sean seguros para la ejecucin de subprocesos.

Plataformas

Windows 98, Windows 2000 SP4, Windows Millennium, Windows Server 2003, Windows XP Media Center, Windows XP Professional x64, Windows XP SP2, Windows XP Starter Edition .NET Framework no admite todas las versiones de cada plataforma. Para obtener una lista de las versiones admitidas, vea Requisitos del sistema.

Das könnte Ihnen auch gefallen