Autor Tema: Problemas al Actualizar un registro  (Leído 4982 veces)

0 Usuarios y 1 Visitante están viendo este tema.

ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Problemas al Actualizar un registro
« en: Junio 20, 2011, 01:29:56 am »
Saludos a todos !!!

Tengo un problema en VB .Net:
Estoy migrando de VB 6.0 a VB 2008, he utilizado el manual para principiantes de VB .Net, sobre todo con respecto a la parte de Base de datos. Excelente.
Me ha servido mucho en la parte de consulta, y en la inserción de registros...
Pero el problema se me presenta en la parte de actualización y eliminación de los mismos.
He buscado ejemplos en la web, y he conseguido muchos utilizando la sentencia Sql "UPDATE", Ahora he encontrado varios ejemplos y en todos me arroja error. Aquí tengo una muestra del último que usé:

Public Class Form1

    Private Conn As FbConnection
    Private Fcsb As FbConnectionStringBuilder
    Private Dad As FbDataAdapter
    Private Dst As DataSet
    Private strSQL As String = ""

    Private Function ConnectionStringBuilder() As String
        Fcsb = New FbConnectionStringBuilder
        With Fcsb
            .ServerType = 0
            .UserID = "xxxxxx"
            .Password = "xxxxxx"
            .Dialect = 3
            .Pooling = False
            .Database = "C:\VB90\General Test\DBTEST.FDB"
        End With
        Return Fcsb.ConnectionString
    End Function

    Private Sub UpdateRegister(ByVal Numero As Long, _
                                                ByVal Nombre As String, _
                                                ByVal Apellido As String, _
                                                ByVal Sexo As String)
        Dim strConn As String = ConnectionStringBuilder()
        strSQL = "UPDATE TST1 SET NOMBRE = @Nombre, APELLIDO = @Apellido, " & _
                       "SEXO = @Sexo WHERE NUMERO = @Numero"

        Using FbConn As New FbConnection(strConn)
            Dim FCmd As New FbCommand(strConn, FbConn)
            With FCmd.Parameters
                .AddWithValue("@NUMERO", Numero)
                .AddWithValue("@NOMBRE", Nombre)
                .AddWithValue("@APELLIDO", Apellido)
                .AddWithValue("@SEXO", Sexo)
            End With
            FbConn.Open()
            Dim nResult As Integer = FCmd.ExecuteNonQuery()
            FbConn.Close()
            MessageBox.Show("Filas actualizadas: " & CStr(nResult), "Filas...", _
            MessageBoxButtons.OK, MessageBoxIcon.Information)
        End Using
    End Sub


End Class

Bueno, la función ConnectionStringBuilder, funciona perfectamente (la probé, gracias a DIOS !!!), ahora al ejecutar la Sub UpdateRegister, ahí es donde se presenta el problema... en la línea:
Dim nResult As Integer = FCmd.ExecuteNonQuery()
Arroja el siguiente error:
"Dynamic SQL Error SQL error code = -104 Token unknown - line 1, column 1 server"
el SQLSTATE arroja "42000" que habla sobre un error en la sintaxis SQL o una violación en las reglas de acceso.

En la Sentencia SQL, "TST1" es el nombre de la tabla. Sus campos:
NUMERO -----> Tipo BIGINT
NOMBRE ----->    " VARCHAR (50)
APELLIDO --->    " VARCHAR (50)
SEXO --------->   " VARCHAR (10)

Todos "not null"

Por favor agradezco la correción, o el uso de otro método !!! Porque ya no hayo que hacer !!! :-[

Saludos a Todos !!!
Manuel F. Borrego S.
Barcelona, Edo. Anzoátegui. Venezuela. 8)
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Problemas al Actualizar un registro
« Respuesta #1 en: Junio 20, 2011, 03:26:20 am »
No estoy seguro, pero por si aca confirma que esta linea:
strSQL = "UPDATE TST1 SET NOMBRE = @Nombre, APELLIDO = @Apellido, " & _
                       "SEXO = @Sexo WHERE NUMERO = @Numero"

deba ser asi:
strSQL = "UPDATE TST1 SET NOMBRE = " & @Nombre & ", APELLIDO = " & @Apellido & ", " & _
                       "SEXO = " & @Sexo & " WHERE NUMERO = " & @Numero

Donde @Nombre lo cambiarías por una variable.
Y digo "no estoy seguro" porque mas adelantes haces esto:
 Dim FCmd As New FbCommand(strConn, FbConn)
            With FCmd.Parameters...

Y de ser eso correcto, tons ya me es dificil detectar el error.
Me encuentras en YAcosta.com

seba123neo

  • Moderador
  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Problemas al Actualizar un registro
« Respuesta #2 en: Junio 20, 2011, 04:18:59 am »
Hola, primero no deberias abrir y cerrar la conexion cada vez que realizas esa operacion, ni nunguna otra.

la conexion debe permanecer abierta y declarada en una variable publica para que este accesible al resto de la aplicacion, pero solo abrirla una sola vez, para eso recomiendo usar un modulo comun donde la declaras y ahi mismo creas el Sub_Main donde abris la conexion, o sea el proyecto te va a comenzar desde el Sub_Main y no desde el load del formulario principal, eso lo cambias en las propiedades del proyecto. tampoco es necesario generar el string de la conexion que estas creando, eso ya no va a ser necesario si la conexion esta como publica,no tenes que hacer eso.

No estoy seguro, pero por si aca confirma que esta linea:
strSQL = "UPDATE TST1 SET NOMBRE = @Nombre, APELLIDO = @Apellido, " & _
                       "SEXO = @Sexo WHERE NUMERO = @Numero"

deba ser asi:
strSQL = "UPDATE TST1 SET NOMBRE = " & @Nombre & ", APELLIDO = " & @Apellido & ", " & _
                       "SEXO = " & @Sexo & " WHERE NUMERO = " & @Numero

esta usando parametros, es una forma especial de .NET, los parametros se declaran en DENTRO del string no fuera como estamos acostumbrados a pasarle valores y despues se le dice que parametro pertenece a tal valor y automaticamente se reemplaza por el valor que le pusiste,creo que estan bien usados, no soy de usar parametros yo prefiero la forma comun de crear el string sql.

para mi el error esta en como manejas la conexion, fijate de hacer lo que te dije.

saludos.

ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Agradecido por las respuestas
« Respuesta #3 en: Junio 20, 2011, 01:13:21 pm »
Saludos mis estimados Yvan y Seba !!! ;D

Ya voy a poner en marcha las sugerencias que me dieron, en cuanto, tenga los resultados les confirmo.
Otra cosa, en VB 6.0 tenía la costumbre, de que cuando necesitaba actualizar o eliminar un resgistro en particular, hacía esto:

Private Sub ActualizarRegistro()
    Dim rs as New ADODB.Recordset
    Dim strSQL as String
    '//
    On Error GoTo ErrorNoDeclarado
    '//
    strSQL = "SELECT * FROM NombreTabla"
    With rs
        .Open strSQL, VariableDeConexion, adOpenDynamic, adLockOptimistic
        .Filter = Var1 & " = '" & Var2 & "'"  '// Var1 representa al Campo de la Tabla y Var2 es la comparación...
        .Fields!Campo1 = xxxxx
        .Fields!Campo2 = yyyyy
        .Fields!Campo2 = zzzzz
        '
        '
        '
        .Update
        .Close
    End With
    Set rs = Nothing

ErrorNoDeclarado:
                             '// Codigo para interceptar posibles errores...

End Sub

Y para eliminar un Registro...

Private Sub EliminarRegistro()
    Dim rs as New ADODB.Recordset
    Dim strSQL as String
    '//
    strSQL = "SELECT * FROM NombreTabla"
    With rs
        .Open strSQL, VariableDeConexion, adOpenDynamic, adLockOptimistic
        .Filter = Var1 & " = '" & Var2 & "'"  '// Var1 representa al Campo de la Tabla y Var2 es la comparación...
        .Delete
        .Close
    End With
    Set rs = Nothing
End Sub

Con estas Sub's he hecho el trabajo requerido de actualizar y eliminar un registro en particular.
En VB 9.0 (VB 2008) no he podido encontrar el equivalente para hacer lo mismo, y de forma sencilla.

Bueno seguiré indagando, y como les dije, en lo que tenga algun resultado les aviso !!!


Saludos.
Manuel F. Borrego S.
Barcelona, Edo. Anzoátegui. Venezuela. 8)
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Problemas al Actualizar un registro
« Respuesta #4 en: Junio 20, 2011, 01:55:41 pm »
Bien Sebas por la aclaracion sobre la cadena, no sabia que se hacia asi en .Net
Sobre lo otro que indico Sebas de la conexión una sola vez en un modulo estoy 100% de acuerdo. Y agrego.

Te recomiendo que no uses open para hacer un Insert, Update o Delete. Usa Execute. No es necesario hacer el Open y con Execute es mas rápido según lei.
Y ya que usas Firebird (se aplica a cualquier motor Cliente - Servidor) has esto (adáptalo a .Net) por ejemplo:

código
código
db.Begintrans   <--- En vez de db usa tu variable
Tu Insert
Tu Update
Otro Insert
Una consulta para el siguiente insert
Otro Insert mas
db.Committrans
código
código

Y el código execute no necesita que declares nada, es asi:
dB.Execute "Insert Into etc etc etc", adCmdText
y ya.

El db.Begintrans abre la transacción y hasta que no llegue al db.Committrans no confirma la transacción que altera la BD. SI por alguna razón se interruempe las transacciones antes de llegar al Commit, entonces la base de datos no se altera, incluso puedes usar un db.Roolback por codigo cuando detectes un error en tu aplicación y quieras deshacer las modificaciones a la BD siempre que no halla llegado a la linea db.Committrans
Este begin y commit te protege de que otra pc toque esas tablas mientras tu la modificas, las otras se ponen en cola.

Saludos
Me encuentras en YAcosta.com

ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Solucionado el problema...
« Respuesta #5 en: Junio 20, 2011, 02:49:51 pm »
Saludos mis estimados !!!

En cuanto lo último que escribiste Yvan...

Dim nResult As Integer = FCmd.ExecuteNonQuery()

El método ExecuteNonQuery, sería más o menos el equivalente a tu propuesta, en cuanto a los métodos BeginsTrans y Committrans, no los he aplicado (quizás por desconocimiento, miedo, terror, horror, etc, etc, etc y no sé que más !!!).
El código anterior, lo tomé en buena parte de "ElGuille":
http://www.elguille.info/NET/ADONET/sql_instrucciones_update.aspx y lo adapté cambiándole unas muy poquitas cosas (apenas).
Resulta que despues de analizar las respuestas que uds me enviaron, descubrí (a mi pesar) que fui un "tarado Visual Basic .Netero", ¿Por qué? aquó viene la respuesta:

        strSQL = "UPDATE TST1 SET NOMBRE = @Nombre, APELLIDO = @Apellido, " & _
                       "SEXO = @Sexo WHERE NUMERO = @Numero"

        Using FbConn As New FbConnection(strConn)
            Dim FCmd As New FbCommand(strConn, FbConn)

Dim FCmd As New FbCommand(strSQL, FbConn)

En vez de "strConn" (una "Burrada" en programación :-[) tenía que colocar "strSQL" donde está contenida la sentencia SQL, seguir la recomendación de que me dieron uds de abrir la conexión aparte (pública) y listo !!! todo solucionado !!! ;D

Muy agradecido quedo de uds !!!

Saludos.
Manuel F. Borrego S.
Barcelona. Venezuela 8)
« última modificación: Junio 20, 2011, 05:38:00 pm por xkiz ™ »
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Problemas al Actualizar un registro
« Respuesta #6 en: Junio 20, 2011, 07:35:44 pm »
Excelente doctor por la aclaración, no se si usare .Net pero nunca se sabe y con lo bien que explicaste el tema yo tendré ese cuidado.

Saludos.
Me encuentras en YAcosta.com

ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Una solución más sencilla...
« Respuesta #7 en: Marzo 19, 2012, 03:22:51 am »
Bueno, tenía tiempo que no veía este post que había iniciado !!! ::)

La verdad era, que por desconocimiento pleno, falta de pericia (todavía hay de eso ::)), etc. etc, etc. me estaba complicando la existencia a la hora de realizar un 'UPDATE' a un registro en particular.

Estaba aplicando unas "redundancias" en el código anterior, y por eso era que venían los errores por omisión y que se yo cuantas pendejadas informáticas más !!! :P

Pero he aquí un código más resumido para realizar el trabajo encomendado:

Código: (VB) [Seleccionar]
Private Sub UpdateRecords()
     Dim sqlUpdate As String = "UPDATE Nombre_Tabla " & _
                                "SET Campo2 = '" & Var2 & _
                                "', Campo3 = '" & Var3 & _
                                "', Campo4 = '" & Var4 & "' " & _
                                "WHERE Campo1 = '" & Var1 & "'"
     FCmd = New FbCommand(sqlUpdate, Conn)
     FCmd.ExecuteNonQuery()
     FCmd = Nothing
End Sub

Espero le pueda ser útil a alguien.


Saludos desde Venezuela.

Manuel F. Borrego S. 8)


PD:  Luego súbiré el manejo de consultas con
       ComboBox, que VB 6.0 es un paseo, pero
       VB .Net (Vb 2008 que yo uso), es otro "detallito"... :o

Edito:
Se me había olvidado, para los que estos comandos (del tipo FbCommand) pueda que les parezcan 'extraños', pero estos son los que se aplican cuando se trabaja con las BD's Firebird. FbCommand es equivalente a SqlCommand, OleDbCommand entre otros.
« última modificación: Marzo 19, 2012, 03:31:17 am por ADONAIRAFA »
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!