Imports System.Data.SqlClient
Imports System.Data
Imports System.Transactions
Imports System.Collections.ObjectModel

Class MainWindow
  Private ConexionConBD As SqlConnection = Nothing
  Private OrdenSql As SqlCommand
  Private Lector As SqlDataReader
  Private strConexion As String = Nothing

  Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs)
    ' Crear la conexión
    strConexion = "Data Source=.\sqlexpress;" &
      "Initial Catalog=bd_telefonos; Integrated Security=True"
  End Sub

  Private Sub btMostrarDatos_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
    Try
      Using ConexionConBD = New SqlConnection(strConexion)
        ' Procedimiento almacenado
        OrdenSql = New SqlCommand("stproObtenerTfnos", ConexionConBD)
        OrdenSql.CommandType = CommandType.StoredProcedure
        OrdenSql.Parameters.AddWithValue("@prefijo", ctSql.Text)

        ' Abrir la base de datos
        ConexionConBD.Open()
        ' ExecuteReader hace la consulta y devuelve un SqlDataReader
        Lector = OrdenSql.ExecuteReader()
        ' Colección de datos obtenida de la consulta
        Dim lista As New ObservableCollection(Of CTelefono)()
        Dim nombre As String, tfno As String
        ' Llamar siempre a Read antes de acceder a los datos
        While Lector.Read() ' siguiente registro
          nombre = TryCast(Lector("nombre"), String)
          tfno = TryCast(Lector("telefono"), String)
          lista.Add(New CTelefono(nombre, tfno))
        End While
        ' Llamar siempre a Close una vez finalizada la lectura
        Lector.Close()
        ' Contextos de datos
        lsTfnos.DataContext = lista
        ctTfno.DataContext = lsTfnos
      End Using
    Catch ex As System.Exception
      MessageBox.Show(ex.Message)
    End Try
  End Sub

  Private Sub btGuardarDatos_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
    Try
      Dim strTelefonoAntiguo As String = TryCast(lsTfnos.SelectedValue, String)
      Dim strTelefonoNuevo As String = ctTfno.Text
      If strTelefonoAntiguo = strTelefonoNuevo Then Return
      Using tr As New TransactionScope()
        Using ConexionConBD = New SqlConnection(strConexion)
          ' Procedimiento almacenado
          OrdenSql = New SqlCommand("stproModificarTfno", ConexionConBD)
          OrdenSql.CommandType = CommandType.StoredProcedure
          OrdenSql.Parameters.AddWithValue("@tfnoAntiguo", strTelefonoAntiguo)
          OrdenSql.Parameters.AddWithValue("@tfnoNuevo", strTelefonoNuevo)

          ' Abrir la base de datos
          ConexionConBD.Open()
          ' Ejecutar la sentencia SQL
          OrdenSql.ExecuteNonQuery()
        End Using
        tr.Complete()
      End Using
      ' Actualizar los datos de la lista
      btMostrarDatos_Click(sender, e)
    Catch ex As System.Exception
      MessageBox.Show(ex.Message)
    End Try
  End Sub
End Class
