Datos personales

miércoles, 24 de agosto de 2011

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding

Este error "Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding", me apareció un día mientras hacia una consulta a mi BD SQL Server 2005, desde mi aplicación Web ASP-NET.


Bueno después de googlear un poco encontré la solución a este problema. Lo que sucede es que la consulta en la base de datos tomaba varios segundos y la conexión no espera lo suficiente, por lo tanto hay que hacer que la conexión espere a que la consulta termine de procesarse.
Bueno la solución que de inmediato me dio resultado es:

- En el código de la consulta a la base de datos, donde haces uso del SQLCOMMAND, hay que agregar la siguiente linea:(Ojo: micommand es una variable de tipo SQLCOMMAND)
micommand .CommandTimeout = 60;

Si esto no te da resultado, no desesperes, aquí quizás encuntres algo que te puede ayudar
 - En la cadena de conexión agregar:
"server=LocalHost;uid=sa;pwd=;database=DataBaseName;Connect Timeout=200; pooling='true'; Max Pool Size=200" 

 - Si no les da resultado, prueben con esto:
En el Web config
<system.web>
            <customErrors mode="Off"/>
            <httpRuntime appRequestQueueLimit="100" executionTimeout="60000" />

</system.web> 
 

Saludos, éxitos...!!!


martes, 16 de agosto de 2011

Error al restaurar Base de Datos Sql 2005

Intenté retaurar una Base de Datos SQL 2005 mediante un backup y me dió el siguiente error

Bueno lo que hay que hacer es lo siguiente:

USE master
GO
ALTER DATABASE mibased SET single_user WITH rollback immediate
ALTER DATABASE mibased SET multi_user

Y LISTO...!!!
¿Que ocurría?
Pues bien lo que pasaba es que la base de datos estaba abierta por otro proceso y teníamos que cerrar todas las conexiones.

Espero haber ayudado. Saludos

lunes, 8 de agosto de 2011

Validación de asp:textbox con números irrepetibles

Para este caso se me pidió validar las cajas de texto <asp:textbox> para que solo se escriban números del 1 al 4 y que un número ya escrito en un tetbox no se repita en otro. Asi:


En realidad no es nada difícil pero lo dejo por si alguna vez alguien lo necesita.  Dibujamos en pantalla 4 textbox, yo los llamé de la siguiente forma: txt_prg17_1, txt_prg17_2, txt_prg17_3, txt_prg17_4
Ahora vamos a hacer uso de una función javascript:
<script language="javascript">
            //función trim para quitar los espacios en blanco
        function trim (myString)
            {
            return myString.replace(/^\s+/g,'').replace(/\s+$/g,'')
            }
           
            function soloNumeros(evt,orden) //evt es el valor digitado, y orden indica a que textbox vamos a validar, si se escribe 1 es el 1er textbox
            {    
                //Validar la existencia del objeto event    
                evt = (evt) ? evt : event;      
                ////Extraer el codigo del caracter de uno de los diferentes grupos de codigos    
                var charCode = (evt.charCode) ? evt.charCode : ((evt.keyCode) ? evt.keyCode : ((evt.which) ? evt.which : 0));      
                //Predefinir como valido     
                var respuesta = true;      
                //Validar si el codigo corresponde a los NO aceptables
                  //valido solo los números del 1 al 4 y el backspace   
                if (charCode > 31 && (charCode < 49 || charCode > 52))    
                {        
                    //Asignar FALSE a la respuesta si es de los NO aceptables        
                    respuesta = false;  
                 }      
            
                //
                if (orden==1) // para el 1er textbox
                        {
// obtengo los valores de los textbox 2,3,4
                              var b = document.getElementById("<%=txt_prg17_2.ClientID %>").value;
                              var c = document.getElementById("<%=txt_prg17_3.ClientID %>").value;
                              var d = document.getElementById("<%=txt_prg17_4.ClientID %>").value;
                         
                              if (trim(b)!="") // validar que tenga valor
                              {
                                    var b_asc=b.charCodeAt(0); // convirto el valor del textbox2 en ascii
                                    if(charCode==b_asc) // comparo ascii si son iguales signnifica q estoy ingresando un valor duplicado asi que se retorna falso
                                          return false;
                              }
                              if (trim(c)!="")
                              {
                                    var c_asc=c.charCodeAt(0);
                                    if(charCode==c_asc)
                                          return false;
                              }
                              if (trim(d)!="")
                              {
                                    var d_asc=d.charCodeAt(0);
                                    if(charCode==d_asc)
                                          return false;
                              }
                        }
                        if (orden==2) // para el 2do textbox
                        {
                              var a = document.getElementById("<%=txt_prg17_1.ClientID %>").value;
                              var c = document.getElementById("<%=txt_prg17_3.ClientID %>").value;
                              var d = document.getElementById("<%=txt_prg17_4.ClientID %>").value;
                 
                              if (trim(a)!="")
                              {
                                    var a_asc=a.charCodeAt(0);
                                    if(charCode==a_asc)
                                          return false;
                              }
                              if (trim(c)!="")
                              {
                                    var c_asc=c.charCodeAt(0);
                                    if(charCode==c_asc)
                                          return false;
                              }
                              if (trim(d)!="")
                              {
                                    var d_asc=d.charCodeAt(0);
                                    if(charCode==d_asc)
                                          return false;
                              }
                        }
                        if (orden==3) // para el 3er textbox
                        {
                              var a = document.getElementById("<%=txt_prg17_1.ClientID %>").value;
                              var b = document.getElementById("<%=txt_prg17_2.ClientID %>").value;
                              var d = document.getElementById("<%=txt_prg17_4.ClientID %>").value;
                 
                              if (trim(a)!="")
                              {
                                    var a_asc=a.charCodeAt(0);
                                    if(charCode==a_asc)
                                          return false;
                              }
                              if (trim(b)!="")
                              {
                                    var b_asc=b.charCodeAt(0);
                                    if(charCode==b_asc)
                                          return false;
                              }
                              if (trim(d)!="")
                              {
                                    var d_asc=d.charCodeAt(0);
                                    if(charCode==d_asc)
                                          return false;
                              }
                        }
                        if (orden==4) // para el 4to textbox
                        {
                              var a = document.getElementById("<%=txt_prg17_1.ClientID %>").value;
                              var b = document.getElementById("<%=txt_prg17_2.ClientID %>").value;
                              var c = document.getElementById("<%=txt_prg17_3.ClientID %>").value;
                 
                              if (trim(a)!="")
                              {
                                    var a_asc=a.charCodeAt(0);
                                    if(charCode==a_asc)
                                          return false;
                              }
                              if (trim(b)!="")
                              {
                                    var b_asc=b.charCodeAt(0);
                                    if(charCode==b_asc)
                                          return false;
                              }
                              if (trim(c)!="")
                              {
                                    var c_asc=c.charCodeAt(0);
                                    if(charCode==c_asc)
                                          return false;
                              }
                        }
                return respuesta;   // si las validaciones se pasaron con éxito, se escribe el valor digitado en la caja de texto
                                             
            }
</script>
Ahora en la vista html de nuestra página referenciamos a nuestra función javascript en el evento OnKeyPress de cada textbox
<asp:TextBox ID="txt_prg17_1" runat="server" MaxLength="1" Width="30px" onKeyPress="javascript:return soloNumeros(event,1)"></asp:TextBox>
<asp:TextBox ID="txt_prg17_2" runat="server" MaxLength="1" Width="30px" onKeyPress="javascript:return soloNumeros(event,2)"></asp:TextBox>
<asp:TextBox ID="txt_prg17_3" runat="server" MaxLength="1" Width="30px" onKeyPress="javascript:return soloNumeros(event,3)"></asp:TextBox>
<asp:TextBox ID="txt_prg17_4" runat="server" MaxLength="1" Width="30px" onKeyPress="javascript:return soloNumeros(event,4)"></asp:TextBox>
Con esto los textbox quedan validados. Este código de seguro se puede optimizar, reducir líneas de código, así que eso tambipen me queda como tarea pendiente jeje. Saludos

jueves, 4 de agosto de 2011

Encriptación de Cadena de conexión en Web.config

Hace unos días tuve un problema de seguridad en una aplicación web desarrollada en Visual Studio 2005 (aspnet 2.0)  ya que la cadena de conexión estaba expuesta en una clase, y necesitaba encontrar una forma de encriptarla.
Tengo la conexión en una función de la siguiente manera:
Dim cn As SqlConnection
cn = New SqlConnection("Data Source=SERVER; Initial Catalog=mibd; User Id=miusuario; Password=miclave;")
cn.Open()

Pues bien,  luego de buscar un poco, decidí colocar la cadena de conexión en el web.config
Entonces en el archivo web.config hacemos lo siguiente:
<connectionStrings>
  <add name="miconexion" connectionString=" Initial Catalog= mibd;
data source=
SERVER;user id= miusuario;password= miclave " />
 </connectionStrings>
Nota:
name="miconexion" ->Nos servirá para referenciar a nuestra conexión más adelante.
Guardamos el archivo web.config.
Ahora agregamos una referencia al proyecto: Clic derecho en el Website àAdd reference. En la pestaña .NET, referenciamos a System.Configuration.
Listo, ahora en la clase desde obtendremos nuestra conexión hacemos lo siguiente:
Imports System.Configuration
Public Class clsconexion
    Public Function conexion() As SqlConnection
        Dim cn As SqlConnection
        Try           
            Dim con As String = System.Configuration.ConfigurationManager.ConnectionStrings("miconexion").ConnectionString
            cn = New SqlConnection(con)
            cn.Open()
        Catch ex As Exception
            Throw
        End Try
        Return cn
    End Function
End Class


Ok, Hasta aqui la conexión ya está guardada en el Web.config
Ahora para encriptar la sección del web.config que contiene la conexión, entraremos a la línea de comandos y escribimos lo siguiente:
C:\Windows\Microsoft.Net\Framework\v2.0.50727>aspnet_regiis -pe "connectionStrings" -app "/MyWebSite"
Donde “MyWebSite”, es el nombre de tu Website.
Ahora si entramos al archivo web.config de nuestro proyecto, encontraremos una sección encriptada. Algo así:
<connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider">
  <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
   xmlns="http://www.w3.org/2001/04/xmlenc#">
   <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
   <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
    <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
     <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
     <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
      <KeyName>Rsa Key</KeyName>
     </KeyInfo>
     <CipherData>
      <CipherValue>GIB5/2UkUOTWG4sxtys9UQMfdfsdfsdf80fdEbB4v915F42RzQVigqJBdCvQbvHDmfJgGWZ6IQU8FLQ/dND2gKtL85qqQRjue/es7D8SJBJkuniZ6ChF74+u763+elTcBcgX9OCRYaqeQpe9BFjPoDJD8oZ5QigXbtS4XS/0JYP7TgOJ2B0=</CipherValue>
     </CipherData>
    </EncryptedKey>
   </KeyInfo>
   <CipherData>
    <CipherValue>dSrDeb7medfsfsdfYmO5j/e1Oo5lDCoX5Q5Z+gq01KwAmWItOGvofUAlZitJm2Sghs/7jwHR24699IsoSYjnjNgHIr8dfsdfsWmsyD/I7vjQwHB+7o1Eb7cIn84j6asWTEeyOEkFHjvUopGfAA+kRYkizb7c92EYRMRXJ8BBOMliHjXacT9tvyjTErvvWMuL/7fFa3shjefFvnjQV8EfUI2MAA97vE0HIb7ysoZ2sUdOT/yJSrlwdfCWJ1XWaLKHuLlAeOyEc/G8WmluVG5pPEKLTpjp2bJ+Qv6iKYwvxQyctJ3o2iJafm5qlpT4OXzqWRg==</CipherValue>
   </CipherData>
  </EncryptedData>
 </connectionStrings>
El cifrado depende de la máquina donde está instalado IIS por tanto, si tenemos dos entornos NO podemos copiar el archivo web.config con secciones cifradas de un servidor a otro pues en el nuevo no se interpretaría el cifrado. Debe ejecutarse el comando individualmente en ambos servidores
Si queremos regresar la cadena de conexión a su estado normal (desencriptar) haremos lo siguiente:
C:\Windows\Microsoft.Net\Framework\v2.0.50727>aspnet_regiis -pd "connectionStrings" -app "/MyWebSite"

Espero haber ayudado a los que tuvieron el mismo problema que yo. Saludos
Con respecto a la función que anteriormente hemos creado, no tenemos que hacer nada adicional, ya que el IIS es el que se encarga de realizar la desencriptación de la conexión.