none
Controlar Error con TRY RRS feed

  • Pregunta

  • Hola,

    Tengo una Tabla  con el Campo Id INT INDENTITY(1,1) y  TipoCuentas  NOT NULL  UNIQUE. Cuando ingreso un dato repetido lo controla el TRY pero el Id se incrementa igual.


    Que puedo hacer para que el Id solo se incremente cuando se inserta el registro ?



     

     

     

     

    Private Sub BtnAgregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAgregar.Click
    
            Try
                CN.Open()
                CMD.CommandType = CommandType.Text
                CMD.CommandText = "INSERT INTO TipoCuentas(TipoCuenta) VALUES('" & TextTipoCuenta.Text & "')"
                CMD.ExecuteNonQuery()
                CN.Close()
            Catch ex As SqlException
                CN.Close()
                MessageBox.Show("error")
            End Try
    End Sub
    
    

     

     

     

     

     

     

     

     

    Saludos

     

     

    domingo, 4 de octubre de 2009 0:15

Respuestas

  • hola

    que db estas utilizando es Sql Server, Ms Access, o alguna otra ?

    la verdad es raro este comportamiento, pero si es el tipo de campo el que controla la secuencia de los id no hay mucho por hacer ya que es la db quien lo controla.

    - una alternativa es que tu quieres controlar la secuencia de los id de la tabla
    o sea previo a al la ejecucion del INSERT deberias ejecutar algo como ser:

    SELECT MAX(Id) As Count FROM TipoCuentas

    de esta forma obtienes el ultimo numero utilizado, al cual le sumas uno y procedes con el insert de esta forma


    Dim maxId As Integer = 'aqui asignas el valor de la consulta anterior +1

    INSERT INTO TipoCuentas(Id, TipoCuenta) VALUES(" & maxId  & ", '" & TextTipoCuenta.Text & "')"

    si se que es bastante manuales esta alternativa pero te da el control absoluto en la creacion de los id de als tablas.


    - igual una consulta molesta tanto que se creen espacios entre los id, si igual son simples identificadores de los registros porque es que quieres mantener una secuencia perfecta.


    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Vito2009 domingo, 4 de octubre de 2009 20:10
    domingo, 4 de octubre de 2009 19:52

Todas las respuestas

  • hola

    Prueba con lo siguiente


    Imports System.Transactions
    
    Private Sub BtnAgregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAgregar.Click
    
    	Try
    		Using scope As New TransactionScope()
    
    			CN.Open()
    			CMD.CommandType = CommandType.Text
    			CMD.CommandText = "INSERT INTO TipoCuentas(TipoCuenta) VALUES('" & TextTipoCuenta.Text & "')"
    			CMD.ExecuteNonQuery()
    			CN.Close()
    
    			scope.Complete()
    
    		End Using
    
    	Catch ex As SqlException
    		CN.Close()
    		MessageBox.Show("error")
    	End Try
     
    End Sub


    como veras lo que engloba al código es una transacción


    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 4 de octubre de 2009 14:31
  • Hola,

    Cuando importo 
    Imports System.Transactions
    Me da el siguiente error:


    Advertencia 1 El espacio de nombres o el tipo especificado en las importaciones 'System.Transactions' no contienen ningún miembro público o no se encuentran. Asegúrese de que el espacio de nombres o el tipo se hayan definido y de que contengan al menos un miembro público. Asegúrese de que el nombre del elemento importado no utilice ningún alias. 
    domingo, 4 de octubre de 2009 17:46
  • hola

    pero has agregado la referencia a System.Transactions ?

    en el proyecto ve dodne dice Referencies y agrega una nueva, por supuesto seria esta que te menciono

    sino tienes la referencia no podras declararla en el Imports


    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 4 de octubre de 2009 19:03
  • Estimado,

    Agregue la referencia y el codigo pero sigo con el mismo problema el Id internamente se sigue incrementando.

    Ej:

    id      -   Nombre
    1       -    a
    2       -    b
    3       -    c

    Si quiero ingresar de nuevo a me da error y cuando inserto un registro valido se ya se incremento el id

    id      -   Nombre
    1       -    a
    2       -    b
    3       -    c
    Aquí intento ingresar nuevamente a
    5       -    d
    6       -    e
    Aquí intento ingresar nuevamente a
    Aquí intento ingresar nuevamente a

    9       -    f
    .
    .
    .
    .
    .

    Por cada excepcion que controle el try se incrementa el id
    domingo, 4 de octubre de 2009 19:38
  • hola

    que db estas utilizando es Sql Server, Ms Access, o alguna otra ?

    la verdad es raro este comportamiento, pero si es el tipo de campo el que controla la secuencia de los id no hay mucho por hacer ya que es la db quien lo controla.

    - una alternativa es que tu quieres controlar la secuencia de los id de la tabla
    o sea previo a al la ejecucion del INSERT deberias ejecutar algo como ser:

    SELECT MAX(Id) As Count FROM TipoCuentas

    de esta forma obtienes el ultimo numero utilizado, al cual le sumas uno y procedes con el insert de esta forma


    Dim maxId As Integer = 'aqui asignas el valor de la consulta anterior +1

    INSERT INTO TipoCuentas(Id, TipoCuenta) VALUES(" & maxId  & ", '" & TextTipoCuenta.Text & "')"

    si se que es bastante manuales esta alternativa pero te da el control absoluto en la creacion de los id de als tablas.


    - igual una consulta molesta tanto que se creen espacios entre los id, si igual son simples identificadores de los registros porque es que quieres mantener una secuencia perfecta.


    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Vito2009 domingo, 4 de octubre de 2009 20:10
    domingo, 4 de octubre de 2009 19:52
  • Hola,

    Estoy Usando SQL Server 2005, mi idea era que quedaran ordenados los Id.

    Voy a intentar incrementar el id de la forma manual.


    Gracias por la ayuda.


    Saludos

    domingo, 4 de octubre de 2009 20:09