Llevo algo más de una semana programando en Visual Basic 2008, ya que, de momento, no hay nada que hacer en CNC. Por como es la aplicación y porque no quiero complicarme la vida (si quisiera, no usaría VB) he tirado de TableAdapterManager en un par de ocasiones. En una, igual que comenté en la entrada anterior dedicada a este componente, dejaba que él abriera y cerrara la conexión. Sin embargo, en la segunda tenía otros accesos a la base de datos, justo antes y justo después a la operación de UpdateAll del TableAdapterManager. En este caso, me venía mejor pararle al «bicho» la conexión ya abierta y que me la dejara abierta una vez terminara. Es imposible, intenta volver a abrir la conexión y se produce el error.
Así que me he puesto a revisar el código que genera Visual Basic 2008 Express (supongo que para las distintas versiones de Visual Studio será el mismo) y me encuentro con una metedura de pata que, si la cometes en un examen o práctica, te garantiza la rechifla del profesor y los compañeros durante unos días (y una nota peligrosamente menguada).
Me explico: el código del método UpdateAll tiene unas líneas pensadas para comprobar si la conexión está abierta. Si está cerrada, la abre y pone una variable booleana de control a True. Al final del método, si esta variable está a True, cierra la conexión. OK. Perfecto.
Lástima que el resultado de esa comprobación sea el mismo tanto si la conexión está abierta como si está cerrada. El código en cuestión es el siguiente:
Dim workConnOpened As Boolean = false If ((workConnection.State And _ Global.System.Data.ConnectionState.Closed) = _ Global.System.Data.ConnectionState.Closed) Then workConnection.Open workConnOpened = true End If |
ConnectionState.Closed vale 0 y ConnectionState.Open vale 1. Si operamos tenemos que, si la conexión (workConnection) está cerrada, 0 AND 0 = 0, con lo que se cumple el If, entra en él y abre la conexión.
Si la conexión está abierta, 1 AND 0 = 0, con lo que se cumple el If, entra en él, intenta abrir la conexión y se produce la excepción.
Olé.
Nota: Con el SP1 de VS2008 este defectillo está solucionado.