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
martes, 16 de diciembre de 2008
Dal.Core.DataServer.vb
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario