From: Richard B. <rb...@us...> - 2005-02-07 07:37:53
|
Update of /cvsroot/jcframework/dotnet/Providers/AF_MSSQL In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10604/Providers/AF_MSSQL Added Files: AF_MSSQL.vbproj AssemblyInfo.vb CMsSqlConnection.vb CMsSqlDatabase.vb Log Message: Break out providers to separate .DLL files. Change <database /> mapping to use proider="xx" instead of class="xx" Start prep work for Informix provider --- NEW FILE: AssemblyInfo.vb --- Imports System Imports System.Reflection Imports System.Runtime.InteropServices ' General Information about an assembly is controlled through the following ' set of attributes. Change these attribute values to modify the information ' associated with an assembly. ' Review the values of the assembly attributes <Assembly: AssemblyTitle("")> <Assembly: AssemblyDescription("")> <Assembly: AssemblyCompany("")> <Assembly: AssemblyProduct("")> <Assembly: AssemblyCopyright("")> <Assembly: AssemblyTrademark("")> <Assembly: CLSCompliant(True)> 'The following GUID is for the ID of the typelib if this project is exposed to COM <Assembly: Guid("88EEC41E-58C3-409C-B89B-DD282479D729")> ' Version information for an assembly consists of the following four values: ' ' Major Version ' Minor Version ' Build Number ' Revision ' ' You can specify all the values or you can default the Build and Revision Numbers ' by using the '*' as shown below: <Assembly: AssemblyVersion("1.0.*")> --- NEW FILE: AF_MSSQL.vbproj --- <VisualStudioProject> <VisualBasic ProjectType = "Local" ProductVersion = "7.10.3077" SchemaVersion = "2.0" ProjectGuid = "{11985DFB-9B77-434C-98F2-89C219C5B506}" > <Build> <Settings ApplicationIcon = "" AssemblyKeyContainerName = "" AssemblyName = "AF_MSSQL" AssemblyOriginatorKeyFile = "" AssemblyOriginatorKeyMode = "None" DefaultClientScript = "JScript" DefaultHTMLPageLayout = "Grid" DefaultTargetSchema = "IE50" DelaySign = "false" OutputType = "Library" OptionCompare = "Binary" OptionExplicit = "On" OptionStrict = "Off" RootNamespace = "AF_MSSQL" StartupObject = "" > <Config Name = "Debug" BaseAddress = "285212672" ConfigurationOverrideFile = "" DefineConstants = "" DefineDebug = "true" DefineTrace = "true" DebugSymbols = "true" IncrementalBuild = "true" Optimize = "false" OutputPath = "bin\" RegisterForComInterop = "false" RemoveIntegerChecks = "false" TreatWarningsAsErrors = "false" WarningLevel = "1" /> <Config Name = "Release" BaseAddress = "285212672" ConfigurationOverrideFile = "" DefineConstants = "" DefineDebug = "false" DefineTrace = "true" DebugSymbols = "false" IncrementalBuild = "false" Optimize = "true" OutputPath = "bin\" RegisterForComInterop = "false" RemoveIntegerChecks = "false" TreatWarningsAsErrors = "false" WarningLevel = "1" /> </Settings> <References> <Reference Name = "System" AssemblyName = "System" /> <Reference Name = "System.Data" AssemblyName = "System.Data" /> <Reference Name = "System.XML" AssemblyName = "System.Xml" /> <Reference Name = "AToMSFramework" Project = "{8FFD05CF-E733-4D8E-BC0E-D9DD37B87384}" Package = "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}" /> </References> <Imports> <Import Namespace = "Microsoft.VisualBasic" /> <Import Namespace = "System" /> <Import Namespace = "System.Collections" /> <Import Namespace = "System.Data" /> <Import Namespace = "System.Diagnostics" /> </Imports> </Build> <Files> <Include> <File RelPath = "AssemblyInfo.vb" SubType = "Code" BuildAction = "Compile" /> <File RelPath = "CMsSqlConnection.vb" SubType = "Code" BuildAction = "Compile" /> <File RelPath = "CMsSqlDatabase.vb" SubType = "Code" BuildAction = "Compile" /> </Include> </Files> </VisualBasic> </VisualStudioProject> --- NEW FILE: CMsSqlDatabase.vb --- Option Strict Off Option Explicit On Imports System.Data.SqlClient Imports AToMSFramework '''----------------------------------------------------------------------------- ''' Project : AToMSFramework ''' Class : CMsSqlDatabase ''' '''----------------------------------------------------------------------------- ''' <summary> ''' Implementation of CRelationalDatabase for Microsoft SQL Server. ''' </summary> ''' <remarks>This class contains the specific functionality required for the ''' framework to interact with Microsoft SQL databases.</remarks> ''' <history> ''' [rbanks] 11/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Class CMsSqlDatabase Inherits CRelationalDatabase Private m_name As String Private m_user As String Private m_password As String Private m_serverName As String '''----------------------------------------------------------------------------- ''' <summary> ''' Establishes a new database connection. ''' </summary> ''' <returns>A CMSSqlConnection containing the newly established connection.</returns> ''' <remarks>The CMSSqlConnection class implements the _CConnection interface which ''' is required by this method. ''' <para>If the connection cannot be established an exception will be thrown.</para> ''' <para>The connection is established using normal SQL server authentication (ie ''' Integrated security is false, and persiste security info is false.</para></remarks> ''' <history> ''' [rbanks] 11/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Overrides Function getNewConnection() As _CConnection Dim conn As New CMSSqlConnection conn.Connection = New SqlConnection conn.ManageTransactions = True Try If m_user Is Nothing OrElse m_user.Length = 0 Then m_user = "" m_password = "" Dim pbroker As CPersistenceBroker pbroker = getPersistenceBrokerInstance() pbroker.GetLoginDetails(Me, m_user, m_password) End If If m_user = "SSPI" Then conn.Connection.ConnectionString = _ "Data Source=" & m_serverName & ";" & _ "Initial Catalog=" & m_name & ";" & _ "Integrated Security=SSPI;" & _ "Persist Security Info=False;" Else conn.Connection.ConnectionString = _ "Data Source=" & m_serverName & ";" & _ "Initial Catalog=" & m_name & ";" & _ "Integrated Security=false;" & _ "Persist Security Info=False;" & _ "User Id=" & m_user & ";" & _ "Password=" & m_password End If conn.Connection.Open() Catch ex As SqlClient.SqlException Throw New DatabaseConnectionException(ex.Message, ex) Catch ex As Exception Throw New DatabaseConnectionException(ex.Message, ex) End Try getNewConnection = conn End Function '''----------------------------------------------------------------------------- ''' <summary> ''' Sets the initial properties of the database. ''' </summary> ''' <param name="properties">The property information supplied in the XML mapping file.</param> ''' <remarks>In order to initialise the database object properly the following must be supplied ''' <list type="bullet"> ''' <item><description>Name: The name of the database on the server (ie the catalog name)</description></item> ''' <item><description>ServerName: The name of the database server</description></item> ''' <item><description>User: The user name for secured databases.</description></item> ''' <item><description>Password: The password for secured databases.</description></item> ''' <item><description>OIDTable: The table name containing the OID A-value. Can be ignored if OIDs are not used.</description></item> ''' </list> ''' <para>If the database is used without having been properly initialised you are likely ''' to get exceptions thrown in your application.</para> ''' </remarks> ''' <history> ''' [rbanks] 11/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Overrides Sub init(ByVal properties As System.Collections.Specialized.HybridDictionary) m_name = properties.Item("name") m_serverName = properties.Item("serverName") m_user = properties.Item("user") m_password = properties.Item("password") If properties.Item("ansinulls") Is Nothing Then UseANSINulls = False Else UseANSINulls = properties.Item("ansinulls") End If MyBase.OIDTable = properties.Item("OIDTable") End Sub '''----------------------------------------------------------------------------- ''' <summary> ''' Gets the value of an object in a format the database can understand. ''' </summary> ''' <param name="tempValue">The object being evaluated.</param> ''' <returns>A string containing the SQL compatible value for the object</returns> ''' <remarks>The following rules are applied when converting object values into ''' database compatible strings ''' <para>Any value that is a Null Alias <see cref="M:AToMSFramework.ModAliasNull.IsNullAlias"/> ''' will be returned as NULL.</para> ''' <para>Strings are enclosed in single quotes. If the string is already enclosed in single quotes then ''' nothing is changed. Also, any single quotes within the string are converted to a pair of single quotes.</para> ''' <para>Dates are converted to yyyy-MM-dd HH:mm:ss format and enclosed in single quotes. If a datetime field ''' only has a time value, then a time-only string is returned instead.</para> ''' <para>Booleans are converted to 1 or 0</para> ''' <para>Numbers are converted to strings directly.</para> ''' <para>Objects that are nothing return a NULL and all other objects are directly converted to strings using their ''' inbuilt ToString methods.</para></remarks> ''' <history> ''' [rbanks] 11/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Overrides Function getValueFor(ByVal tempValue As Object) As String Dim tempRetorno As String Dim dd As DateTime Dim OriginalCulture As System.Globalization.CultureInfo Dim TempCulture As System.Globalization.CultureInfo If IsNullAlias(tempValue) Then Return "NULL" Else Select Case VarType(tempValue) Case VariantType.String If Left(tempValue, 1) = "'" And Right(tempValue, 1) = "'" And CStr(tempValue).Length > 2 Then 'string already enclosed in quotes so ignore tempRetorno = tempValue Else 'replace single quote with double quote, and enclose entire string in quotes tempRetorno = "'" & Replace(tempValue, "'", "''") & "'" End If Case VariantType.Date TempCulture = New System.Globalization.CultureInfo("en-US") OriginalCulture = System.Threading.Thread.CurrentThread.CurrentCulture System.Threading.Thread.CurrentThread.CurrentCulture = TempCulture System.Threading.Thread.CurrentThread.CurrentUICulture = TempCulture dd = CType(tempValue, DateTime) If dd = Date.MinValue Then tempRetorno = "NULL" Else If dd.Date.Ticks = 0 Then 'MSSQL doesn't support dates with years less than 1753, so time only 'values that format to "0001-01-01 11:23:00" for example produce errors. 'If it's just a time we will only return time portion. tempRetorno = "'" & dd.ToString("HH:mm:ss") & "'" Else tempRetorno = "'" & dd.ToString("yyyy-MM-dd HH:mm:ss") & "'" End If End If System.Threading.Thread.CurrentThread.CurrentCulture = OriginalCulture System.Threading.Thread.CurrentThread.CurrentUICulture = OriginalCulture Case VariantType.Boolean tempRetorno = IIf(tempValue, "1", "0") Case VariantType.Single, VariantType.Double, VariantType.Decimal, VariantType.Decimal tempRetorno = tempValue.ToString Case Else tempRetorno = tempValue End Select End If getValueFor = tempRetorno End Function '''----------------------------------------------------------------------------- ''' <summary> ''' Gets the next OID A-Value from the database. ''' </summary> ''' <returns>A integer containing the A-Value.</returns> ''' <remarks>A connection is established to the database and the OIDTable (specified in ''' the XML mapping) is queried and updated. The obtained A-Value is returned. ''' <para>Should an error occur a value of 0 will be returned.</para></remarks> ''' <history> ''' [rbanks] 11/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Overrides Function getNextOIDAvalue() As Integer Dim rs As New DataSet Dim da As New SqlDataAdapter Dim cb As SqlCommandBuilder Dim aValue As Integer Dim row As System.Data.DataRow Dim p As SqlParameter Dim initvals() As Object = {1} Dim x As OIDException Dim conn As CMSSqlConnection conn = Me.getConnection(Nothing) conn.AutoCommit = False conn.startTransaction() Try da.SelectCommand = New SqlCommand("select oidAValue from " & Me.OIDTable, conn.Connection, conn.Transaction) cb = New SqlCommandBuilder(da) da.Fill(rs, "oid") If rs.Tables(0).Rows.Count = 0 Then 'Seed with value = 1 row = rs.Tables(0).Rows.Add(initvals) aValue = 1 Else rs.Tables(0).Rows(0).Item(0) += 1 aValue = rs.Tables(0).Rows(0).Item(0) End If da.Update(rs, "oid") da.Dispose() conn.commit() Catch err As SqlException conn.rollback() x = New OIDException(err.Message, err) Catch err As Exception conn.rollback() x = New OIDException(err.Message, err) Finally Me.freeConnection(conn) If Not x Is Nothing Then Throw x End If End Try Return aValue End Function '''----------------------------------------------------------------------------- ''' <summary> ''' Method to get the last Identity value for the connection. ''' </summary> ''' <param name="conn">The connection to use.</param> ''' <returns>An integer containing the value of the last updated identity column</returns> ''' <remarks>If multiple identity columns were updated the return value will only contain ''' the value of the last identity column updated. ''' <para>Identity values are retrieved by querying the @@IDENTITY value.</para> ''' <para>Should an error occur an exception will be thrown.</para></remarks> ''' <history> ''' [rbanks] 11/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Overrides Function getIdentityValue(ByVal conn As _CConnection) As Integer Dim rs As New DataSet Dim da As New SqlDataAdapter Dim cb As SqlCommandBuilder Dim aValue As Integer Dim connection As CMSSqlConnection connection = conn connection.AutoCommit = False Try da.SelectCommand = New SqlCommand("select @@IDENTITY", connection.Connection, connection.Transaction) cb = New SqlCommandBuilder(da) da.Fill(rs, "identity") If rs.Tables(0).Rows.Count = 0 Then Throw New IdentityValueException("Could not retrieve identity value") Else If IsDBNull(rs.Tables(0).Rows(0).Item(0)) Then aValue = 0 Else aValue = rs.Tables(0).Rows(0).Item(0) End If Debug.WriteLine("Returned Identity value: " & aValue.ToString) End If da.Dispose() Catch err As SqlException Throw New IdentityValueException(err.Message, err) End Try Return aValue End Function '''----------------------------------------------------------------------------- ''' <summary> ''' Returns the SQL syntax placeholder for a parameter ''' </summary> ''' <param name="i">The number of the parameter being added</param> ''' <returns>A string containing the SQL parameter placeholder</returns> ''' <remarks>Since the parameter is for an MSSQL connection only a the returned ''' string is in the format of @pxxx where xxx is the value of the input integer (i).</remarks> ''' <history> ''' [rbanks] 23/01/2004 Created ''' </history> '''----------------------------------------------------------------------------- Public Overrides Function getParamHolder(ByVal i As Integer) As String Return "@p" & CStr(i) End Function Public Overrides Function limitClauseAtStart() As Boolean Return True End Function Public Overrides Function getClauseStringLimit() As String Return "TOP" End Function Public Overrides Function getClauseStringTableAlias(ByVal table As String, ByVal owner As String, ByVal pAlias As String) As String Return Me.m_name & "." & owner & "." & table & " as " & pAlias End Function Public Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If Not m_disposed Then If disposing Then Dim conn As CMSSqlConnection While ConnectionPool.Count > 0 conn = ConnectionPool.Pop conn.Dispose() End While m_disposed = True End If End If End Sub End Class --- NEW FILE: CMsSqlConnection.vb --- Imports System.Data.SqlClient Imports AToMSFramework '''----------------------------------------------------------------------------- ''' Project : AToMSFramework ''' Class : CMSSqlConnection ''' '''----------------------------------------------------------------------------- ''' <summary> ''' Connection class for MSSql data sources ''' </summary> ''' <remarks><para>This class implements the <see cref="T:AToMSFramework._CConnection"/> interface and is used ''' to manage connections to MSSQL datasources.</para> ''' <para>The following should be taken into consideration when using this ''' class:</para> ''' <para>1. Only one physical transaction runs on a database connection at any one time</para> ''' <para>2. Only one physical connection to the database exists. Multiple connection ''' objects will share a connection where possible</para> ''' <para>3. If nested transactions are started, the commit or rollback only occurs on the ''' first transaction created. A rollback on any nested transaction will cause all ''' outside transactions to also roll back.</para> ''' </remarks> ''' <seealso cref="T:AToMSFramework._CConnection"/> ''' <history> ''' [rbanks] 18/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Class CMSSqlConnection Implements _CConnection Implements IDisposable '************************************************** 'Class: CMSSqlConnection 'Author: Richard Banks '************************************************** Private m_connection As SqlConnection Private m_autoCommit As Boolean Private m_started As Boolean Private m_manageTransactions As Boolean Private m_transaction As SqlTransaction Private m_transactioncalls As Integer Private m_references As Integer Private m_db As _CRelationalDatabase Private Const DEBUG_MODE As Boolean = True Private m_disposed As Boolean '''----------------------------------------------------------------------------- ''' <summary> ''' The actual SQL Server connection for the object. ''' </summary> ''' <value></value> ''' <remarks></remarks> ''' <history> ''' [rbanks] 1/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Property Connection() As SqlConnection Get Connection = m_connection End Get Set(ByVal Value As SqlConnection) m_connection = Value End Set End Property '''----------------------------------------------------------------------------- ''' <summary> ''' See <see cref="P:AToMSFramework._CConnection.AutoCommit">_CConnection</see>. ''' </summary> ''' <value></value> ''' <remarks></remarks> ''' <history> ''' [rbanks] 1/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Property AutoCommit() As Boolean Implements _CConnection.AutoCommit Get AutoCommit = m_autoCommit End Get Set(ByVal Value As Boolean) m_autoCommit = Value End Set End Property '''----------------------------------------------------------------------------- ''' <summary> ''' See <see cref="P:AToMSFramework._CConnection.Started">_CConnection</see>. ''' </summary> ''' <value></value> ''' <remarks></remarks> ''' <history> ''' [rbanks] 1/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Property Started() As Boolean Implements _CConnection.Started Get Started = m_started End Get Set(ByVal Value As Boolean) m_started = Value End Set End Property '''----------------------------------------------------------------------------- ''' <summary> ''' See <see cref="P:AToMSFramework._CConnection.ManageTransactions">_CConnection</see>. ''' </summary> ''' <value></value> ''' <remarks></remarks> ''' <history> ''' [rbanks] 1/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Property ManageTransactions() As Boolean Implements _CConnection.ManageTransactions Get ManageTransactions = m_manageTransactions End Get Set(ByVal Value As Boolean) m_manageTransactions = Value End Set End Property '''----------------------------------------------------------------------------- ''' <summary> ''' See <see cref="M:AToMSFramework._CConnection.commit">_CConnection</see>. ''' </summary> ''' <remarks></remarks> ''' <history> ''' [rbanks] 1/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Sub commit() Implements _CConnection.commit If DEBUG_MODE Then If m_transactioncalls = 1 Then System.Diagnostics.Debug.WriteLine("COMMIT TRANSACTION") Else System.Diagnostics.Debug.WriteLine("Nested COMMIT TRANSACTION - not actually called") End If End If If Me.ManageTransactions Then If m_transactioncalls = 1 Then m_transaction.Commit() getPersistenceBrokerInstance().commitCache(Me.Database) Me.Started = False m_transaction = Nothing End If m_transactioncalls -= 1 End If End Sub '''----------------------------------------------------------------------------- ''' <summary> ''' The current transaction for the connection. ''' </summary> ''' <history> ''' [rbanks] 1/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public ReadOnly Property Transaction() As SqlTransaction Get Transaction = m_transaction End Get End Property '''----------------------------------------------------------------------------- ''' <summary> ''' See <see cref="M:AToMSFramework._CConnection.startTransaction">_CConnection</see>. ''' </summary> ''' <history> ''' [rbanks] 1/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Overloads Sub startTransaction() Implements _CConnection.startTransaction If DEBUG_MODE Then If m_transactioncalls = 0 Then System.Diagnostics.Debug.WriteLine("BEGIN TRANSACTION") Else System.Diagnostics.Debug.WriteLine("Nested BEGIN TRANSACTION - not actually called") End If End If If Me.ManageTransactions Then If Not Me.Started Then m_transaction = m_connection.BeginTransaction getPersistenceBrokerInstance().startCacheTransaction(Me.Database) End If m_transactioncalls += 1 Me.Started = True End If End Sub '''----------------------------------------------------------------------------- ''' <summary> ''' See <see cref="M:AToMSFramework._CConnection.processStatement">_CConnection</see>. ''' </summary> ''' <param name="statement"></param> ''' <remarks></remarks> ''' <history> ''' [rbanks] 1/12/2003 Created ''' [rbanks] 23/01/2004 Changed to use SQL parameters ''' </history> '''----------------------------------------------------------------------------- Public Sub processStatement(ByVal statement As CSqlStatement) Implements _CConnection.processStatement Dim m_command As New SqlCommand Dim m_recordcount As Integer Dim cp As CSQLParameter Dim param As SqlParameter Dim dd As Date Try m_command.Connection = m_connection m_command.CommandText = statement.SqlString For Each cp In statement.Parameters If Not cp.Ignore Then param = New SqlParameter param.ParameterName = cp.Name param.SqlDbType = CType(cp.Column.ProviderType, SqlDbType) If TypeOf (cp.Value) Is DateTime Then dd = cp.Value If dd.Ticks = 0 Then dd = DateAdd(DateInterval.Year, 1899, dd) Else dd = New Date(dd.Year, dd.Month, dd.Day, dd.Hour, dd.Minute, dd.Second, 0) End If cp.Value = dd End If param.Value = cp.Value m_command.Parameters.Add(param) End If Next m_command.Transaction = m_transaction Debug.WriteLine(m_command.CommandText) m_recordcount = m_command.ExecuteNonQuery() If m_recordcount = 0 Then Throw New NothingUpdatedException("No records were affected by the update") End If Catch err As SqlException Throw err Catch err As Exception Throw err End Try End Sub '''----------------------------------------------------------------------------- ''' <summary> ''' See <see cref="M:AToMSFramework._CConnection.processSelectStatement">_CConnection</see>. ''' </summary> ''' <param name="statement"></param> ''' <returns></returns> ''' <remarks></remarks> ''' <history> ''' [rbanks] 1/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Function processSelectStatement(ByVal statement As CSqlStatement) As CResultset Implements _CConnection.processSelectStatement SyncLock GetType(CMsSqlConnection) Dim x As RetrieveException Dim rs As New CResultset Dim param As SqlParameter Dim dd As Date Dim m_command As New SqlCommand If DEBUG_MODE Then System.Diagnostics.Debug.WriteLine(statement.SqlString) End If m_command.Connection = m_connection m_command.CommandText = statement.SqlString For Each cp As CSQLParameter In statement.Parameters If Not cp.Ignore Then param = New SqlParameter param.ParameterName = cp.Name param.SqlDbType = CType(cp.Column.ProviderType, SqlDbType) If TypeOf (cp.Value) Is DateTime Then dd = cp.Value If dd.Ticks = 0 Then dd = DateAdd(DateInterval.Year, 1899, dd) Else dd = New Date(dd.Year, dd.Month, dd.Day, dd.Hour, dd.Minute, dd.Second, 0) End If cp.Value = dd End If param.Value = cp.Value m_command.Parameters.Add(param) End If Next Try Dim m_adapter As New SqlDataAdapter(m_command) If m_transactioncalls > 0 Then m_adapter.SelectCommand.Transaction = m_transaction m_adapter.Fill(rs.ResultSet, "ole") m_adapter.Dispose() Catch err As SqlException x = New RetrieveException("SQL Error: " & err.Message, err) Catch err As Exception x = New RetrieveException(err.Message, err) End Try If Not x Is Nothing Then Throw x End If processSelectStatement = rs End SyncLock End Function '''----------------------------------------------------------------------------- ''' <summary> ''' See <see cref="M:AToMSFramework._CConnection.rollback">_CConnection</see>. ''' </summary> ''' <remarks></remarks> ''' <history> ''' [rbanks] 1/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Sub rollback() Implements _CConnection.rollback Dim pb As CPersistenceBroker If DEBUG_MODE Then If m_transactioncalls = 1 Then System.Diagnostics.Debug.WriteLine("ROLLBACK TRANSACTION") Else System.Diagnostics.Debug.WriteLine("Nested ROLLBACK TRANSACTION - not actually performed") End If End If If Me.ManageTransactions Then If m_transactioncalls = 1 Then Try m_transaction.Rollback() Catch ex As Exception End Try getPersistenceBrokerInstance().rollbackCache(Me.Database) Me.Started = False m_transaction = Nothing End If m_transactioncalls -= 1 End If End Sub Public Sub New() MyBase.New() 'By default we manage tranactions 'For DB's that do not manage transactions we should 'set this attribute to false m_manageTransactions = True m_references = 0 End Sub '''----------------------------------------------------------------------------- ''' <summary> ''' See <see cref="M:AToMSFramework._CConnection.CloseConnection">_CConnection</see>. ''' </summary> ''' <remarks></remarks> ''' <history> ''' [rbanks] 1/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Sub CloseConnection() Implements _CConnection.CloseConnection m_references -= 1 If m_references = 0 Then m_connection.Close() End If End Sub '''----------------------------------------------------------------------------- ''' <summary> ''' See <see cref="P:AToMSFramework._CConnection.IsClosed">_CConnection</see>. ''' </summary> ''' <value></value> ''' <remarks></remarks> ''' <history> ''' [rbanks] 1/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public ReadOnly Property IsClosed() As Boolean Implements _CConnection.IsClosed Get Return m_connection.State = ConnectionState.Closed End Get End Property '''----------------------------------------------------------------------------- ''' <summary> ''' See <see cref="P:AToMSFramework._CConnection.ReferenceCount">_CConnection</see>. ''' </summary> ''' <value></value> ''' <remarks></remarks> ''' <history> ''' [rbanks] 1/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Property ReferenceCount() As Integer Implements _CConnection.ReferenceCount Get Return m_references End Get Set(ByVal Value As Integer) m_references = Value End Set End Property '''----------------------------------------------------------------------------- ''' <summary> ''' See <see cref="P:AToMSFramework._CConnection.getTableSchema">_CConnection</see>. ''' </summary> ''' <param name="tName"></param> ''' <returns></returns> ''' <remarks></remarks> ''' <history> ''' [rbanks] 1/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Function getTableSchema(ByVal tName As String) As System.Data.DataTable Implements _CConnection.getTableSchema Dim statement As String Dim cmd As SqlCommand Dim dr As SqlDataReader Dim dt As DataTable statement = "select * from " & tName Try cmd = New SqlCommand(statement, Me.Connection) dr = cmd.ExecuteReader(CommandBehavior.SchemaOnly) dt = dr.GetSchemaTable Catch ex As Exception dt = Nothing Throw ex End Try Return dt End Function Public Overloads Sub startTransaction(ByVal isolationLevel As System.Data.IsolationLevel) Implements _CConnection.startTransaction If DEBUG_MODE Then If m_transactioncalls = 0 Then System.Diagnostics.Debug.WriteLine("BEGIN TRANSACTION") Else System.Diagnostics.Debug.WriteLine("Nested BEGIN TRANSACTION - not actually called") End If End If If Me.ManageTransactions Then If Not Me.Started Then m_transaction = m_connection.BeginTransaction(isolationLevel) getPersistenceBrokerInstance().startCacheTransaction(Me.Database) End If m_transactioncalls += 1 Me.Started = True End If End Sub Public Property Database() As _CRelationalDatabase Implements _CConnection.Database Get Return m_db End Get Set(ByVal Value As _CRelationalDatabase) m_db = Value End Set End Property Public Overloads Sub Dispose() Implements System.IDisposable.Dispose Dispose(True) GC.SuppressFinalize(Me) End Sub Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean) If Not m_disposed Then If disposing Then If Me.Started AndAlso Not m_transaction Is Nothing Then m_transaction.Rollback() m_transaction = Nothing End If If Not m_connection Is Nothing Then m_connection.Close() m_connection.Dispose() m_connection = Nothing End If m_db = Nothing m_disposed = True End If End If End Sub Protected Overrides Sub Finalize() ' Simply call Dispose(False). Dispose(False) End Sub End Class |