martes, 16 de diciembre de 2008

Dal.Core.DataServer.vb

Namespace Dal

  Public Class DataServer
    Private Shared CADENA_DE_CONEXION As String = "server=serve;database=;uid=;pwd=;"
    ' variable conexion
    Shared _connection As Data.IDbConnection
    Shared _Trazas As BooleanSwitch = New BooleanSwitch("ConsultasDAL", "", "1")
    Public Shared DisableLog As Boolean = False

    ' Constructor privado
    Private Sub New()
      ' Evitar la creacion de objetos de esta clase
    End Sub

#Region " Propiedades "
    Public Shared ReadOnly Property ConnectionString() As String
      Get
        Return _connection.ConnectionString()
      End Get
    End Property

    Public Shared ReadOnly Property Connection() As Data.IDbConnection
      Get
        Return _connection
      End Get
    End Property
#End Region

#Region " Metodos "

    ' Abre la conexion con la base de datos
    Public Shared Sub Open(ByVal ConnectionString As String)
      Close()
      _connection = New SqlClient.SqlConnection(ConnectionString)
      _connection.Open()
    End Sub

    ' Cierra la conexion con la base de datos
    Public Shared Sub Close()
      If _connection IsNot Nothing Then
        _connection.Close()
        _connection.Dispose()
      End If
    End Sub

    Public Shared Sub SetWebConnection(ByVal value As String)
      CADENA_DE_CONEXION = value
    End Sub

    Public Shared Function OpenInternal2(ByVal servidor As String, ByVal baseDeDatos As String, ByVal usuario As String, ByVal password As String) As IDbConnection
      Dim tempConnection As Data.IDbConnection
      tempConnection = New SqlClient.SqlConnection(String.Format( _
                          "server={0};database={1};uid={2};pwd={3};Application Name=AppName.WindowsForms;", New String() { _
                          Helpers.ParseCadena(servidor), _
                          Helpers.ParseCadena(baseDeDatos), _
                          Helpers.ParseCadena(usuario), _
                          Helpers.ParseCadena(password)}))
      tempConnection.Open()

      With DirectCast(tempConnection, SqlClient.SqlConnection)
        Trace.WriteLineIf(_Trazas.Enabled, String.Format("DAL.CreateConnection  : {0} {1}", .GetHashCode, DateTime.Now.ToString("HH:mm:ss tt")))
        AddHandler .Disposed, AddressOf OnDisposeConnection
        AddHandler .StateChange, AddressOf OnStateChange
      End With
      Return tempConnection
    End Function


    Public Shared Function GetNewConection(ByVal servidor As String, ByVal baseDeDatos As String, ByVal usuario As String, ByVal password As String) As IDbConnection
      Return OpenInternal2(servidor, baseDeDatos, usuario, password)
    End Function

    Public Shared Function GetNewConection() As IDbConnection
      Dim c As SqlClient.SqlConnection = New SqlClient.SqlConnection(CADENA_DE_CONEXION)
      c.Open()
      AddHandler c.Disposed, AddressOf OnDisposeConnection
      Trace.WriteLineIf(_Trazas.Enabled, String.Format("DAL.CreateConnection  : {0} {1}", c.GetHashCode, DateTime.Now.ToString("HH:mm:ss tt")))
      Return c
    End Function

    Private Shared Sub OnDisposeConnection(ByVal sender As Object, ByVal e As EventArgs)
      Trace.WriteLineIf(_Trazas.Enabled, String.Format("DAL.DisposeConnection : {0} {1}", sender.GetHashCode, DateTime.Now.ToString("HH:mm:ss tt")))
    End Sub
    Private Shared Sub OnStateChange(ByVal sender As Object, ByVal e As StateChangeEventArgs)
      Trace.WriteLineIf(_Trazas.Enabled, String.Format("DAL.StateChage : {0} {1}", sender.GetHashCode, e.CurrentState))
    End Sub

#End Region

#Region " Transacciones "
    Shared _transaction As Data.IDbTransaction

    Public Shared ReadOnly Property InTransaction() As Boolean
      Get
        Return Transaction IsNot Nothing
      End Get
    End Property

    Public Shared ReadOnly Property Transaction() As Data.IDbTransaction
      Get
        Return _transaction
      End Get
    End Property

    Public Shared Function CreateOrUseTransaction() As Data.IDbTransaction
      If _transaction Is Nothing Then _transaction = CreateTransaction(_connection)
      Return _transaction
    End Function
    Public Shared Function CreateTransaction(ByVal c As IDbConnection) As Data.IDbTransaction
      Trace.WriteLineIf(_Trazas.Enabled, "Dal --> BeginTransaction")
      Return c.BeginTransaction
    End Function

    Public Shared Sub Rollback(ByVal t As IDbTransaction)
      If t Is Nothing Then
        Trace.WriteLineIf(_Trazas.Enabled, "Dal --> Rollback : No existe Transacción en curso")
      Else
        t.Rollback()
        t.Dispose()
        t = Nothing
        Trace.WriteLineIf(_Trazas.Enabled, "Dal --> Rollback")
      End If
    End Sub
    Public Shared Sub Rollback()
      Rollback(_transaction)
    End Sub

    Public Shared Sub Commit(ByVal t As IDbTransaction)
      If t Is Nothing Then
        Trace.WriteLineIf(_Trazas.Enabled, "Dal --> Commit: No existe Transacción en curso")
      Else
        t.Commit()
        t.Dispose()
        t = Nothing
        Trace.WriteLineIf(_Trazas.Enabled, "Dal --> Commit")
      End If
    End Sub

    Public Shared Sub Commit()
      Commit(_transaction)
    End Sub

    Public Shared Sub DisposeTransaction(ByVal t As IDbTransaction)
      If t IsNot Nothing Then
        t.Dispose()
        t = Nothing
      End If
    End Sub

    Public Shared Sub DisposeTransaction()
      DisposeTransaction(_transaction)
    End Sub

#End Region

    Public Shared Function ExecuteReader(ByVal cmd As IDbCommand) As IDataReader
      Return ExecuteCommand(Of IDataReader)(cmd, AddressOf _ExecuteReader)
    End Function
    Public Shared Function ExecuteNonQuery(ByVal cmd As IDbCommand) As Integer
      Return ExecuteCommand(Of Integer)(cmd, AddressOf _ExecuteNonQuery)
    End Function
    Public Shared Function ExecuteScalar(Of T)(ByVal cmd As IDbCommand) As T
      Return ExecuteCommand(Of T)(cmd, AddressOf _ExecuteScalar)
    End Function

    ' Para centralizar los mensajes de error de la Capa de Acceso a Datos
    ' de forma que se puedan: Escribir la sentencia SQL, escribir en un log, tratar el texto de error, etc
    Private Shared Function ExecuteCommand(Of T)(ByVal cmd As IDbCommand, ByVal handler As CommandHandler(Of T)) As T
      Try
        If _Trazas.Enabled And DisableLog = False Then
          Trace.WriteLine(IIf(cmd.Transaction IsNot Nothing, "Dal --> Transaction.", "DAL.") & "ExecuteCommand : " & cmd.CommandText)
        End If
        DisableLog = False
        Return handler(cmd)
      Catch e As Exception
        ' Trace the exception into the same log.
        Trace.WriteLine("--- Exception : " & e.Message)
        ' Aqui se podría inntentar controlar los mensajes de error de clave duplicada, etc...
        Throw New Exception("Data Access Layer Exception ", e)
      End Try
    End Function
    Private Shared Function _ExecuteReader(ByVal Cmd As IDbCommand) As IDataReader
      Return Cmd.ExecuteReader()
    End Function
    Private Shared Function _ExecuteNonQuery(ByVal Cmd As IDbCommand) As Integer
      Dim Res As Integer = Cmd.ExecuteNonQuery()
      If _Trazas.Enabled Then
        Trace.WriteLine(IIf(Cmd.Transaction IsNot Nothing, "Dal --> Transaction ", "DAL ") & Res & " Filas")
      End If
      Return Res
    End Function
    Private Shared Function _ExecuteScalar(Of T)(ByVal Cmd As IDbCommand) As T
      Return Cmd.ExecuteScalar
    End Function

  End Class
End Namespace

No hay comentarios: