Inicio > .Net > campeon9999 > duplica llave en membresia

duplica llave en membresia

Experto:
Usuario:
Fecha: 20/08/2006
Valoración: (4,00 sobre 5) Categoría: .Net
07/08/2006
ratxamala, usuario preguntando en .Net
Usuario
Cuando creo un nuevo miembro se me esta moviendo 3 tablas aspnet_Membership, aspnet_Users, aspnet_UserInRoles

En la primera Tabla aspnet_Membership coloca en el campo UserId=123

y lo enlaza con la segunda aspnet_Users y coloca en los campos UserId=123, UserName=XXX


y finalmente con la tabla aspnet_UserInRoles y coloca en el campo UserId=123

con el codigo que tengo actualmente que es el siguiente me esta doblando la informacion en la base de datos de membresia pero solo en las tablas aspnet_Users, aspnet_UserInRoles osea que me esta creando ademas en la tabla de aspnet_Users un nuevo registro con el mismo UserName y con diferente UserId y lo mismo pasa con la tabla aspnet_UserInRoles

ejemplo:

aspnet_Membership

UserId


123

aspnet_Users

UserId UserName
123 XXX
456 XXX

aspnet_UserInRoles

UserId
123
456


El problema surge cuando borro pues el solo me va a tomar el UserId=123 y me va a dejar en las tablas aspnet_Users, aspnet_UserInRoles el UserId=456 y en la tabla de aspnet_Users el campo UserName=XXX y supuestamente esta eliminado y cuando voy a hacer una inclusion con el mismo nombre pues marca error puesto que UserName=XXX ya se encuentra en la tabla aspnet_Users.

El codigo actual es el siguiente a mi me parece que esta bien pero nose porq se me duplica:

Try
Membership.CreateUser(TextLogin.Text, TextPassword.Text, TextEmail.Text)
Roles.AddUserToRole(TextLogin.Text, "Artista")
Catch ex As MembershipCreateUserException
LabelError.Visible = True
LabelError.Text = GetErrorMessage(ex.StatusCode)
Exit Sub
End Try

debido a esto que no le encuentro explicacion decidi borrar el registro de mas en el evento rowdeleting del gridview con el siguiente codigo pero el hp en la variable res1 me bota dizq el valor de res1=XXX cuando en el SELECT llamado sql1 estoy es preguntando por el UserId y no por el UserName y por eso cuando hago el DELETE del sql2 se totea.

Este es el codigo si hay algo mal me dice please

Dim x As String = e.Keys(0).ToString

conn.Open()
Dim sql As String = "SELECT UserName FROM aspnet_Users WHERE UserName = @UserName"
Dim cmd As New SqlCommand(sql, conn)
cmd.Parameters.Add("UserName", Data.SqlDbType.NVarChar)
cmd.Parameters.Item(0).Value = x
Dim res As String = cmd.ExecuteScalar.ToString

Membership.DeleteUser(res)
'me borra correctamente el UserId=123 pero me deja el UserId=456 y UserName=XXX


Dim sql1 As String = "SELECT UserId FROM aspnet_Users WHERE UserName = @UserName1"
Dim cmd1 As New SqlCommand(sql1, conn)
cmd1.Parameters.Add("UserName1", Data.SqlDbType.NVarChar)
cmd1.Parameters.Item(0).Value = x
Dim res1 As String = cmd.ExecuteScalar.ToString

Dim sql2 As String = "DELETE FROM aspnet_UsersInRoles WHERE UserId = @UserId"
Dim cmd2 As New SqlCommand(sql2, conn)
cmd2.Parameters.Add("UserId", Data.SqlDbType.NVarChar)
cmd2.Parameters.Item(0).Value = res1
cmd2.ExecuteNonQuery()
'aqui el hp me bota dizq res1=XXX y no hace el DELETE

Dim sql3 As String = "DELETE FROM aspnet_Users WHERE UserName=@username3"
Dim cmd3 As New SqlCommand(sql3, conn)
cmd3.Parameters.Add("username3", Data.SqlDbType.NVarChar)
cmd3.Parameters.Item(0).Value = res
cmd3.ExecuteNonQuery()


espero pronta respuesta...
08/08/2006
ratxamala, experto respondiendo en .Net
Experto
La verdad es que es un poco lioso, bueno es normal que con un delete por el userid no te borre los que tienen distinto userid. Si tienes la posibilidad lo mejor que puedes hacer es activarle el delete cascade en la BBDD a las tablas hijas, para que si se borra un registro en la padre la BBDD elimine los dependientes de forma automatica ( es las mas rapido y seguro). Lo que no acab de entender es lo que comentas al princicio, eso de que creas un resitro y el te crea 2. Eso no debería pasar y solo se me ocurre que tengas en la BBDD un trigger que te los cree o que tengas algo de código mal que lo haga, pero lo que me has pegado es correcto. Bueno pudes explicarte mejor con lo que crees que esta pasando.Por cierto si los parametros son cadenas de textos puedes usar el & para concatenarlas y ahorrarte el paso de parametros a los comandos, que es bastante lento.
Un saludo
11/08/2006
ratxamala, usuario preguntando en .Net
Usuario
Primero que todo gracias por contestar oportunamente... quisiera saber como hago entonces para habilitar el borrado en cascada en la base de datos hecha en sqlserver2005...con respecto a lo segundo si exactamente lo que estoy escribiendo me esta sucediendo me esta duplicando la informacion en el campoUserName de la tabla aspnet_Users y el codigo que he copiado es el que se esta ejecutando...:(

espero pronta respuesta...
14/08/2006
ratxamala, experto respondiendo en .Net
Experto
Hola de nuevo, te pego un link para que veas como se habilita el borrado en cascada en una tabla:
http://www.informit.com/guides/content.asp?g=sqlserver&seqNum=53&rl=1
o este otro (aunque ponga que para moviles te sirve de todas formas).
http://msdn2.microsoft.com/en-us/library/ms174123.aspx

Si miras en este ultimo encontraras la solucion al otro problema. Tienes que tener activado en las tablas hijas el update cascade, que te inserta un registro en estas tablas cada vez que creas uno nuevo en la padre, si quieres puedes desactivarlo o, esto será lo mejor, en vez de hacer insert en la tabla hacer update sobre el registro recien creado por la PK que tienes de la insercion en la tabla padre. Espero haberme explicado. Un saludo y no te olvides de finalizar.
18/08/2006
ratxamala, experto respondiendo en .Net
Experto
Por favor si la no necesitas mas aclaraciones finaliza la pregunta.
Un saludo
20/08/2006
ratxamala, usuario preguntando en .Net
Usuario
ok gracias
Más opciones
Enlaces patrocinados