Tema: Ultimo id
Ver Mensaje Individual
  #10 (permalink)  
Antiguo 04/07/2011, 16:00
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ultimo id

Veamos algo más simple: Una función que devuelva cero (0) si la tabla está vacía, cero si se produce un error y el próximo ID si hay al menos un registro.
- No necesitas un DataReader, con un DataAdapter alcanza.
- No debes usar un ORDER BY, si estás consultando por MAX(), ya la función MAX() no sólo te esta devolviendo el mayor de todos, sino que además sólo devuelve un registro.
La idea es:
Código vb:
Ver original
  1. Private Function Obtener_ID() As Integer
  2.         Try
  3.             Dim cad As New MySqlConnection("Database=Pacientes;Data Source=localhost;User Id=root;Password=utan")
  4.             cad.Open()
  5.             Dim sql As String = "SELECT MAX(id) MaxId FROM generales;"
  6.             Dim oTabla As New DataTable
  7.             Dim cmd As New MySqlCommand(sql, cad)
  8.             Dim oReader As New MySqlDataAdapter(cmd)
  9.             oReader.Fill(oTabla)
  10.             cad.Close()
  11.             If oTabla.Rows.Count = 1 Then
  12.                 Return Convert.ToInt32(oTabla.Rows(0).Item("MaxId")) + 1
  13.             Else
  14.                 Return 1
  15.             End If
  16.         Catch ex As MySqlException
  17.             MessageBox.Show("Error:" & ex.Message)
  18.             Return 0
  19.         Catch ex As Exception
  20.             MessageBox.Show("Error:" & ex.Message)
  21.             Return 0
  22.         End Try
  23.     End Function
Usar un DataReader en una operación no secuencial no tiene ningún sentido. Tiene lógica cuando vas a obtener un conjunto de registros y realizar alguna operación on-line con la tabla en forma secuencial. No es tu caso, ya que sólo quieres un dato.
De hecho, ni siquiera requieres un datatable. Alcanzaría con esto:
Código vb:
Ver original
  1. Private Function Obtener_ID() As Integer
  2.         Try
  3.             Dim Valor As Integer
  4.             Dim cad As New MySqlConnection("Database=Pacientes;Data Source=localhost;User Id=root;Password=utan")
  5.             cad.Open()
  6.             Dim sql As String = "SELECT MAX(id) MaxId FROM generales;"
  7.             Dim cmd As New MySqlCommand(sql, cad)
  8.             Valor = Convert.ToInt32(cmd.ExecuteScalar)
  9.             Return Valor
  10.         Catch ex As MySqlException
  11.             MessageBox.Show("Error:" & ex.Message)
  12.             Return 0
  13.         Catch ex As Exception
  14.             MessageBox.Show("Error:" & ex.Message)
  15.             Return 0
  16.         End Try
  17.     End Function
Esto es porque ExecuteScalar() devuelve un único valor, si la consulta devuelve precisamente un sólo campo y un registro, como en este caso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)