Abr 14

Existen tres formas de hacer DataBind en ASP.NET 3:

Eval. Es un DataBind en una sola dirección, lo que significa que obtiene el dato del DataSource pero si ocurre alguna modificación en el campo, no lo puede regresar al DataSource.

Ejemplo:

ASP:
  1. <%#Eval(”NombreDeLaColumna”)%>

Bind. Es un DataBind de dos direcciones, lo que significa que obteiene el dato del DataSource y si ocurre alguna modificación en el campo, lo regresa al DataSource para su modificación.

Ejemplo:

ASP:
  1. <%#Bind(”NombreDeLaColumna”)%>

Uso de una función. Es posible utilizar una función para mostrar un dato. Toma esta situación por ejemplo: En la tabla que estamos mostrando tenemos una llave foránea, que hace la relación con otra tabla. En vez de mostrar el ID numérico (por ejemplo 34) es mejor mostrar un campo alfanumérico, pero ese campo alfanumérico se encuentra en la otra tabla. Para accederlo puedes crear una función a la cual le des como entrada el ID numérico y regrese el valor alfanumérico legible para el usuario.

Ejemplo:

ASP:
  1. <%# Funciones.ObtenDatoAlfanumerico(Eval("IdTabla")) %>

Es muy útil saber esto, sobre todo el tercer ejemplo.

Abr 11

Hace poco tuve que hacer un backup de una base de datos de SQL Server y restaurarla (restore) en otro servidor distinto.

Para hacer el respaldo (backup) en el servidor de origen, usando Microsoft SQL Server Management Studio Express, haces clic con el botón derecho en la base de datos y seleccionas Tasks -> Back Up...

backup.gif

Luego en la pantalla que aparece, seleccionas el tipo de backup llamado Full.

backupoptions2bis2.gif

El archivo de respaldo quedará guardado en la ruta que aparece bajo el titulo Destination.

Ahora descarga ese archivo al servidor donde vas a restaurar la base de datos. Por cierto, ya tiene que existir la base de datos (aunque esté vacía) para que puedas restaurar la información.

Ahora conectado al servidor destino, haz clic en la base de datos donde deseas vaciar la información y haz clic con el botón derecho y selecciona Tasks -> Restore -> Database...

restore.gif

Selecciona la opción From device, haz clic en el botón con los tres puntitos, selecciona el archivo que descargaste y verás esta pantalla (asegúrate de marcar la casilla bajo Restore):

restore3bis.gif

Ahora haz clic en Ok.

Si ves el siguiente error:

Error 3154: The backup set holds a backup of a database other than the existing 'xxxx' database

entonces haz clic en la página Options en el panel izquierdo y marca la casilla Overwrite the existing database:

restore4.gif

Y listo, con eso se restaurarán todos los elementos de tu base de datos original.

Feb 24

A veces es necesario insertar un valor nulo (null) en una base de datos de SQL Server usando ASP.NET.

Esto puede ocurrir ya sea en un insert o un update.

Suponiendo que el tipo de datos en la base de datos es un smallint y sabiendo que en ASP.NET corresponde a un tipo de datos Int16, esta es la manera de declarar un entero nulo:

VB.NET:
  1. Dim EnteroNulo As Nullable(Of Int16) = Nothing

Y listo, ahora lo puedes usar en tu DAL o BLL:

VB.NET:
  1. Dim RenglonesAfectados As Integer = Adapter.ModificaTabla(Fecha, EnteroNulo)

Feb 22

Si vas a implementar el Membership Provider de ASP.NET con SQL Server, seguramente encontrarás mucha información en Internet de cómo hacerlo. La parte que no todo mundo explica es cómo crear las tablas que contendrán toda la información de nombres de usuario, contraseñas, roles, etc.

Las tablas se crean mediante la herramienta aspnet_regsql.exe que se encuentra en el directorio de la versión del Framework que estés usando (ejemplo: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727). Si usas la versión 3.5 tienes que usar la herramienta que viene en el fólder de la versión 2.

Abre una ventana de MS-DOS y cámbiate a dicho fólder:

aspnet_regsql.exe

La sintáxis de la herramienta es:

Option Description

-?

Prints Aspnet_regsql.exe Help text in the command window.

-W

Runs the tool in wizard mode. This is the default if no command-line arguments are specified.

-C <connection string>

Specifies the connection string to the computer running SQL Server where the database will be installed, or is already installed. This option is not necessary if you specify only the server (-S) and login (-U and -P, or -E) information.

-S <server>

Specifies the name of the computer running SQL Server where the database will be installed, or is already installed.

-U <login ID>

The SQL Server user ID to log in with. This option also requires the password (-P) option. This option is not necessary if you are authenticating using Windows credentials (-E).

-P <password>

The SQL Server password to log in with. This option also requires the user ID (-U) option. This option is not necessary if you are authenticating using Windows credentials (-E).

-E

Authenticates using the Windows credentials of the currently logged-on user.

-sqlexportlonly <filename>

Generates a SQL script file that can be used to add or remove the specified features. The specified actions are not performed.

 

Option Description

-A all|m|r|p|c|w

Adds support for one or more ASP.NET application services. Service identifiers can be specified together or separately. The following identifiers are used for ASP.NET application services:

all - All services, including common tables and stored procedures shared by the services

m - Membership

r - Role Manager

p - Profile

c - Web Parts Personalization

w - Web Events

-R all|m|r|p|c|w

Removes support for one or more application services. Service identifiers can be specified together or separately. The following identifiers are used for ASP.NET application services:

all - All services, including common tables and stored procedures shared by the services

m - Membership

r - Role Manager

p - Profile

c - Web Parts Personalization

w - Web Events

-Q

Runs the tool in quiet mode and does not confirm before removing an application service.

-d <database>

Specifies the name of the database to create or modify for use with application services. If the database is not specified, the default database name of "aspnetdb" is used.

 

Si necesitas más información, visita esta página.

En un caso sencillo, solamente necesitamos habilitar el Membership provider y el Role provider, por lo que nuestra sintáxis sería:

aspnet_regsql -S servidor\sqlexpress -U usuario -P contrasena -A mr -d nombredelabasededatos

Donde:

-S va seguido del nombre de tu servidor, ya sea en tu red local o en Internet (usa la IP)
-U va seguido de tu nombre de usuario
-P va seguido de tu contraseña
-A va seguido de "mr" ya que queremos habilitar el Membership y Role.
-d va seguido del nombre de tu base de datos

Creando las tablas para el Membership y Role Providers

Listo, ahora solamente verifica que se crearon las tablas correctamente:

Tablas de Membership y Role Provider

Actualización 2008-05-10

Para entender cómo están relacionadas las tablas entre sí, puedes revisar el siguiente diagrama:

Diagrama de tablas del Membership y Role Provider

El siguiente paso sería crear el connectionString en tu archivo web.config, ponlo bajo la sección configuration:

XML:
  1. <connectionStrings>
  2.     <add name="MiConnectionString" connectionString="Data Source=SERVIDOR\SQLEXPRESS;Initial Catalog=nombredelabasededatos;Persist Security Info=True;User ID=usuario;Password=contrasena"
  3.      providerName="System.Data.SqlClient" />
  4.   </connectionStrings>

Y luego, bajo la sección system.web coloca lo siguiente:

XML:
  1. <!--
  2.             The <authentication> section enables configuration
  3.             of the security authentication mode used by
  4.             ASP.NET to identify an incoming user.
  5.         -->
  6.       <authentication mode="Forms">
  7.         <forms loginUrl="~/Default.aspx" name=".ASPXFORMSAUTH" timeout="300"/>
  8.       </authentication>
  9.       <roleManager defaultProvider="MiRoleProvider" enabled="true" cacheRolesInCookie="true" cookieName=".ASPROLES" cookieTimeout="30" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true" cookieProtection="All">
  10.         <providers>
  11.           <clear/>
  12.           <add name="MiRoleProvider" connectionStringName="MiConnectionString" applicationName="NOMBREAPP" type="System.Web.Security.SqlRoleProvider"/>
  13.         </providers>
  14.       </roleManager>
  15.       <membership defaultProvider="MiMembershipProvider">
  16.         <providers>
  17.           <clear/>
  18.           <add name="MiMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="MiConnectionString" applicationName="NOMBREAPP" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" requiresUniqueEmail="true" passwordFormat="Clear"/>
  19.         </providers>
  20.       </membership>

Con esto le indicas a tu aplicación que utilice para la autenticación la base de datos que creaste al inicio.

Ahora, para crear usuarios y roles utiliza la herramienta que viene incluida con Visual Web Developer 2008, haz clic en Website -> ASP.NET Configuration:

aspnetconfiguration.gif

Esto abrirá una ventana de tu navegador y podrás ver la página administrativa en la que puedes crear roles, usuarios y asignar esos usuarios a los roles que desees. Esta página administrativa, para conectarse a la base de datos, utiliza los valores establecidos en el web.config.

herramienta.gif

Ya no explico cómo usar esta herramienta porque es muy sencilla.

Si estás trabajando en un servidor local y creaste algunos roles y usuarios, y tienes que subir esa información al servidor con algún programa de sincronización de bases de datos, hazlo en este orden para evitar errores de integridad referencial:

La siguiente tabla no debe ser sincronizada porque el procedimiento de aspnet_regsql rellena la información necesaria:
aspnet_SchemaVersions

Primera pasada:
aspnet_Applications

Segunda pasada:
aspnet_Users

Tercera pasada:
aspnet_Membership

Cuarta pasada:
aspnet_Roles

Quinta pasada:
aspnet_UsersInRoles

Suerte!

Feb 12

Es sencillo, simplemente usa:

VB.NET:
  1. If My.User.IsAuthenticated = False Then
  2.      'haz algo
  3. Else
  4.      'haz algo
  5. End If

Feb 8

Encontré un caso truculento el día de hoy. Tengo un ListView que tiene un ItemTemplate dentro del cual estoy poniendo controles de tipo CheckBox. El usuario puede elegir varios de éstos, y cuando se oprime un botón necesito validar la cantidad de casillas que seleccionó.

Aquí está mi ListView y el botón.

ASP:
  1. <asp:ListView ID="ListadoPlanes" runat="server"
  2.         ItemPlaceholderID="AquiVanItems" DataSourceID="ODSPlanes">
  3.     <LayoutTemplate>
  4.   <table width="100%" border="0" cellspacing="0" cellpadding="3">
  5.     <tr>
  6.       <td class="TdDegra">Seleccione hasta 4 opciones</td>
  7.       <td class="TdDegra">Nombre</td>
  8.     </tr>
  9.     <asp:PlaceHolder ID="AquiVanItems" runat="server"></asp:PlaceHolder>
  10.    </table>                           
  11.     </LayoutTemplate>
  12.     <ItemTemplate>
  13.     <tr>
  14.       <td>
  15.         <asp:CheckBox ID="Plan" runat="server" />
  16.         <asp:HiddenField ID="PlanId" runat="server" Value='<%#Eval("idplan")%>' />
  17.       </td>
  18.       <td><%#Eval("Nombre")%></td>
  19.  </tr>
  20.     </ItemTemplate>
  21. </asp:ListView>
  22. <asp:Button ID="Button1" runat="server" Text="Button" />

En la línea 15 estoy creando el CheckBox con el ID igual a "Plan". Necesito guardar, en cada renglón, el ID de mi tabla, que se llama "idplan", por lo que en la línea 16 creo un HiddenField y establezco su valor con mi id. Ahora en cada renglón tendré una casilla de verificación y un campo con el id de mi tabla.

Ahora bien, para iterar en los renglones del ListView e ir checando cada CheckBox, usa el siguiente código:

VB.NET:
  1. Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
  2.  
  3.     Dim CuentaCtrl As Int16 = 0
  4.     Dim i As Integer
  5.     Dim ElCheckBox As CheckBox
  6.     Dim ElHidden As HiddenField
  7.     For i = 0 To ListadoPlanes.Items.Count - 1
  8.         ElCheckBox = CType(ListadoPlanes.Items(i).FindControl("Plan"), CheckBox)
  9.         ElHidden = CType(ListadoPlanes.Items(i).FindControl("PlanId"), HiddenField)
  10.         If ElCheckBox.Checked = True Then
  11.             CuentaCtrl = CuentaCtrl + 1
  12.             'Si necesitas hacer algo con tu id en este ciclo,
  13.             'accedelo usando ElHidden.Value
  14.         End If
  15.     Next
  16.  
  17.     If CuentaCtrl> 2 Or CuentaCtrl = 0 Then
  18.         'Hacer algo
  19.  
  20.     Else
  21.         'Hacer algo
  22.     End If
  23.  
  24. End Sub

En la iteración estoy revisando las opciones seleccionadas y al final solamente tomo una decisión dependiendo de cuántas casillas están marcadas.

Suerte!

Feb 7

En ocasiones puedes tener muchos CheckBoxes desplegados de tal manera que no te permite crear un CheckBoxList (por ejemplo, en tablas), y requieres validar que el visitante no ha marcado más de n número de casillas.

Para hacerlo necesitas colocar todos tus CheckBoxes dentro de un control Panel para poder iterarlos e ir contando. Puedes implementar la validación con un CustomValidator.

La página ASP.NET debe tener lo siguiente:

ASP:
  1. <asp:Panel ID="MiPanel" runat="server">
  2.     <asp:CheckBox ID="Op1" runat="server" />
  3.     <asp:CheckBox ID="Op2" runat="server" />
  4.     <asp:CheckBox ID="Op3" runat="server" />
  5.     <asp:CheckBox ID="Op4" runat="server" />
  6. </asp:Panel>
  7. <asp:CustomValidator ID="CustomValidator1"
  8.                                   runat="server" CssClass="validador" Display="Static"
  9.                                   ErrorMessage="Por favor seleccione un máximo de 2 opciones."
  10.                                   ForeColor="" OnServerValidate="ValidaCheckboxes"></asp:CustomValidator>

Ahí están tus cuatro opciones y tu validador, nota que la función a la que manda llamar el validador se llama ValidaCheckboxes, la cual debe aparecer en tu código de servidor:

VB.NET:
  1. Sub ValidaCheckboxes(ByVal sender As Object, ByVal args As ServerValidateEventArgs)
  2.  
  3.     Dim Ctrl As Control
  4.     Dim Chk As CheckBox
  5.     Dim CuentaCtrl As Int16 = 0
  6.     For Each Ctrl In MiPanel.Controls
  7.         If TypeOf (Ctrl) Is CheckBox Then
  8.             Chk = CType(Ctrl, CheckBox)
  9.             If Chk.Checked = True Then
  10.                 CuentaCtrl = CuentaCtrl + 1
  11.             End If
  12.         End If
  13.     Next
  14.  
  15.     If CuentaCtrl > 2 Then
  16.         args.IsValid = False
  17.     Else
  18.         args.IsValid = True
  19.     End If
  20.  
  21. End Sub

Listo, es todo lo que necesitas. Suerte!

Feb 3

Es importante establecer los tipos de datos correctos en las variables de ASP.NET que utilizas para realizar operaciones con datos que provienen de una base de datos de SQL Server. Pero ¿qué tipos de datos cuando estás programando en ASP.NET corresponden a cada tipo de datos definido en SQL Server?

Aquí esta la lista de equivalencias:

SQL Server data type

CLR data type (.NET Framework)

varbinary

Byte[]

binary

Byte[]

varbinary(1), binary(1)

byte, Byte[]

image

None

varchar

None

char

None

nvarchar(1), nchar(1)

Char, String, Char[]

nvarchar

String, Char[]

nchar

String, Char[]

text

None

ntext

None

uniqueidentifier

Guid

rowversion

Byte[]

bit

Boolean

tinyint

Byte

smallint

Int16

int

Int32

bigint

Int64

smallmoney

Decimal

money

Decimal

numeric

Decimal

decimal

Decimal

real

Single

float

Double

smalldatetime

DateTime

datetime

DateTime

sql_variant

Object

User-defined type(UDT)

Same class that is bound to the user-defined type in the same assembly or a dependent assembly.

table

None

cursor

None

timestamp

None

xml

None

Encontrarás la lista completa en esta página.

Feb 2

Si creas una página en ASP.NET y en su evento Load pones lo siguiente:

VB.NET:
  1. Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  2.         Label1.Text = Session.SessionID & " " & Session("idsesion")
  3.         Response.Write(Session.SessionID)
  4.     End Sub

notarás que cada vez que oprimes Refresh o Actualizar en tu navegador, la variable de sesión se modifica. Definitivamente es raro porque uno siempre ha sabido que la variable de sesión debe ser la misma durante todo el tiempo que el visitante permanece visitando la aplicación.

Bueno, la variable de sesión permanece igual siempre y cuando se coloque algún valor en el estado de la sesión. (yo tampoco entiendo muy bien la razón).

El caso es que para solucionar el problema "de raíz", creé una variable de sesión en el código del archivo Global.asax, justo cuando se crea la sesión (checa la línea 21):

VB.NET:
  1. <%@ Application Language="VB" %>
  2.  
  3. <script runat="server">
  4.  
  5.     Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
  6.         ' Code that runs on application startup
  7.     End Sub
  8.    
  9.     Sub Application_End(ByVal sender As Object, ByVal e As EventArgs)
  10.         ' Code that runs on application shutdown
  11.     End Sub
  12.        
  13.     Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
  14.         ' Code that runs when an unhandled error occurs
  15.     End Sub
  16.  
  17.     Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
  18.         ' Code that runs when a new session is started
  19.         'La siguiente linea evita que session.sessionid se modifique cada
  20.         'vez que se oprime Refresh en el navegador
  21.         Session("idsesion") = Session.SessionID
  22.     End Sub
  23.  
  24.     Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
  25.         ' Code that runs when a session ends.
  26.         ' Note: The Session_End event is raised only when the sessionstate mode
  27.         ' is set to InProc in the Web.config file. If session mode is set to StateServer
  28.         ' or SQLServer, the event is not raised.
  29.     End Sub
  30.        
  31. </script>

Esto hace que el estado de la sesión permanezca sin modificarse y ahora el código del Response.Write(Session.SessionID) citado anteriormente regresa siempre el mismo valor. =)

Ene 28

¿Estás buscando tu propio icono (indicador) de espera para Ajax?

Esta página es muy buena, te permite crear el tuyo personalizado con los colores que desees, tiene una amplia variedad y los diseños están atractivos. La salida es un gif animado que puedes descargar.

http://www.ajaxload.info/

« Previous Entries Next Entries »