none
Error por falta de conversión de String a Guid. ¿Como Solucionarlo?

    Pregunta

  • Hola:

     

    El siguiente código me da un error, y creo que es porque el "sId" en la tabla es formato "uniqueidentifier" (guid) y lo recoge de la dirección http y lo pasa a formato string, pero no he visto como puedo pasarlo a formato guid.

     

    Code Snippet

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Dim sID As String

    Dim sUserName As String

    Dim conn As SqlConnection

    Dim cmd As SqlCommand

    Dim cmdString As String = "Select [UserId] From aspnet_Users Where " _

    & "[UserId] = @Userid "

     

    sID = Request.QueryString("UserID").Trim()

    sUserName = Request.QueryString("UN").Trim()

     

    conn = New SqlConnection("data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true")

    cmd = New SqlCommand(cmdString, conn)

    cmd.Parameters.Add("@UserId", SqlDbType.UniqueIdentifier, 256)

    cmd.Parameters("@UserId").Value = sID

     

    conn.Open()

    Dim myReader As SqlDataReader

     

    myReader = cmd.ExecuteReader() 'En esta línea es donde me da el error.

    conn.Close()

     

     

    El error que me dá es el siguiente, y como he dicho creo que es por la conversión que no está hecha de string a guid:

     

    Code Snippet

    Error de servidor en la aplicación '/MyWeb'.

    Conversión no válida desde 'System.String' hasta 'System.Guid'.

    Descripción: Excepción no controlada al ejecutar la solicitud Web actual. Revise el seguimiento de la pila para obtener más información acerca del error y dónde se originó en el código.

    Detalles de la excepción: System.InvalidCastException: Conversión no válida desde 'System.String' hasta 'System.Guid'.

    Error de código fuente:

    Línea 29:         Dim myReader As SqlDataReader
    Línea 30:         Me.lblMensaje.Text = sID & " " & sUserName
    Línea 31:         myReader = cmd.ExecuteReader()

    Línea 32:         conn.Close()Línea 33:


    Archivo de origen: C:\Documents and Settings\Juan Carlos\Mis documentos\Visual Studio 2005\WebSites\MyWeb\Activate.aspx.vb    Línea: 31

    Seguimiento de la pila:

    [InvalidCastException: Conversión no válida desde 'System.String' hasta 'System.Guid'.]   
    System.Convert.DefaultToType(IConvertible value, Type targetType, IFormatProvider provider) +867  
    System.String.System.IConvertible.ToType(Type type, IFormatProvider provider) +8  
    System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) +408  
    System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType) +896

    [InvalidCastException: Error al convertir el valor del parámetro de String a Guid.]  
    System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType) +943  
    System.Data.SqlClient.SqlParameter.GetCoercedValue() +29  
    System.Data.SqlClient.SqlParameter.Validate(Int32 index, Boolean isCommandProc) +97  
    System.Data.SqlClient.SqlCommand.BuildParamList(TdsParser parser, SqlParameterCollection parameters) +166  
    System.Data.SqlClient.SqlCommand.BuildExecuteSql(CommandBehavior behavior, String commandText, SqlParameterCollection parameters, _SqlRPC& rpc) +253  
    System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +1005  
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +132  
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32  
    System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +122  
    System.Data.SqlClient.SqlCommand.ExecuteReader() +84  
    Activate.Page_Load(Object sender, EventArgs e) in C:\Documents and Settings\Juan Carlos\Mis documentos\Visual Studio 2005\WebSites\MyWeb\Activate.aspx.vb:31  
    System.Web.UI.Control.OnLoad(EventArgs e) +99  
    System.Web.UI.Control.LoadRecursive() +47  
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436

     

     

    Un Saludo y Gracias.

    Juan Carlos

     

    lunes, 06 de octubre de 2008 21:17

Todas las respuestas

  • Yo siempre que quiero crear un Guid hago:
    Guid MyGuid = new Guid("xxxx-xxxx-xxxx-xxxx-xxxx");

    Lo k yo programo en C# pero supongo k para visual basic sera lo mismo.


    Espero que te sirva de ayuda. Saludos.
    lunes, 06 de octubre de 2008 22:00
  • Hola Marc:

    El Guid ya lo tengo creado en la tabla de usuarios. Lo que hago es que lo cogo de la dirección http: y lo meto en una variable string,  pero la utilizo para hacer una consulta de selección contra la base de datos pero hay es donde me da el error.

    Un Saludo.
    Juan Carlos
    martes, 07 de octubre de 2008 5:58
  • Deberas usar un GUID para comprarlo con otro GUID(El de la database) osea que tendras que coger esa string y volvverla a pasar a GUID.

    Por otro lado si estas usando sqlserver te recomiendo que cojas el aspnet_reqsql.exe del framework 2.0 para crear las tablas de membership y administracion de users, luego en la aplicacion tienes la clase membership del namespace System.Web.Security, con esta clase puedes hacer listas de usuarios, cargarlos por varios parametros, borrarlos, darlos de alta, activarlos y desactivarlos, bloquearlos y desbloquearlos y adjuntarles roles.


    Un saludo y Feliz Martes.


    martes, 07 de octubre de 2008 7:25
  • Hola Marc:

     

    Lo estoy haciendo con las bases de datos que genera aspnet_regsql.exe. Pero para activar el usuario me coge el UserId de la dirección http: que la que me da error al compararla con la de la base de datos. Esta última está en tipo GUID y la que recojo de la dirección http la tengo en tipo string, pero no se como convertirla a tipo guid.

     

    Un Saludo.

    Juan Carlos

     

    martes, 07 de octubre de 2008 7:31
  • Pues el error no se porque te lo da, pero ya te digo utiliza el Membership, es lo que utilizo yo, si quieres un listado de usuarios puedes utilizar el MembershipUserCollection y si quieres uno en particular el membership.getuser().

    Es lo que uso yo, ademas tampoco trabajo con datareader y creando los objetos de conexion y comando porque utilizo clases de negocio con dataset.(Supongo k internamente ara algo parecido).

    Saludos.
    martes, 07 de octubre de 2008 8:10
  • Si no te importa me puedes mandar un ejemplo de como utlizas Membership si hacerlo con DataReader, para poder buscar un usuario mediante su UserId y UserName.

     

    Un Saludo.

    Juan Carlos

     

    martes, 07 de octubre de 2008 8:17
  • Hombre pues la verdad esque es muy muy estensa esta clase, tendrias k mirarte el manual de security de www.asp.net/learn. De todas maneras algunos ejemplos.

    para autentificar: FormsAuthentication.Authenticate(username, password) te devuelve true si pertenece algun usuario y false si no o el pass es incorrecto.

    Membership.GetUser() Este metodo esta sobrecargado, puedes buscar por providerkey(GUID) o por Username(string) y te retorna un membershipUser a este le puedes aplicar varios metodos como .Isaproved o .IsBlocked y varios mas.

    nose... tienes muchas cosas para trabajar con usuarios. si necesitas algo mas especifico dimelo, a si la respuesta te ha sido de utilidad marcala como correcta.
    martes, 07 de octubre de 2008 9:02