From: Richard B. <rb...@us...> - 2005-02-07 07:38:05
|
Update of /cvsroot/jcframework/dotnet/Providers/AF_ODBC In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10604/Providers/AF_ODBC Added Files: AF_ODBC.vbproj AssemblyInfo.vb CODBCConnection.vb CODBCDatabase.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("B02291D0-DF67-455A-8EDC-AEC19EA5A400")> ' 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: CODBCDatabase.vb --- Option Strict Off Option Explicit On Imports System.Data.Odbc Imports System.Collections.Specialized Imports AToMSFramework '''----------------------------------------------------------------------------- ''' Project : AToMSFramework ''' Class : CMsAccessDatabase ''' '''----------------------------------------------------------------------------- ''' <summary> ''' Implementation of CRelationalDatabase for ODBC sources ''' </summary> ''' <remarks>This class contains the specific functionality required for the ''' framework to interact with ODBC compliant ''' data sources.</remarks> ''' <history> ''' [rbanks] 11/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Class CODBCDatabase Inherits CRelationalDatabase '************************************************** 'Class: CODBCDatabase 'Author: Richard Banks '************************************************** Private m_connectionString As String Private Const DEBUG_MODE As Boolean = True '''----------------------------------------------------------------------------- ''' <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 location of the database (ie the .mdb file)</description></item> ''' <item><description>User: The user name for secured databases. Use AnyUser for unsecured databases.</description></item> ''' <item><description>Password: The password for secured databases. Use AnyPassword for unsecured 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 HybridDictionary) m_connectionString = properties.Item("name") 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 double quotes. If the string is already enclosed in double quotes then ''' nothing is changed. Also, double quotes within the string are converted to a pair of double quotes.</para> ''' <para>Dates are converted to MM/dd/yy HH:mm:ss format and enclosed in hashes (#).</para> ''' <para>Booleans are converted to TRUE or FALSE</para> ''' <para>Numbers are converted to strings directly. Note that floating point numbers from locales that use ''' a comma for the decimal marker are converted to use the period as the decimal marker.</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 tempRetorno = "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 tempRetorno = "'" & dd.ToString("yyyy-MM-dd HH:mm:ss") & "'" End If System.Threading.Thread.CurrentThread.CurrentCulture = OriginalCulture System.Threading.Thread.CurrentThread.CurrentUICulture = OriginalCulture Case VariantType.Boolean tempRetorno = IIf(tempValue, "TRUE", "FALSE") Case VariantType.Single, VariantType.Double, VariantType.Decimal, VariantType.Decimal tempRetorno = Replace(tempValue, ",", ".") Case Else If tempValue Is Nothing Then tempRetorno = "NULL" Else tempRetorno = tempValue End If End Select End If getValueFor = tempRetorno End Function '''----------------------------------------------------------------------------- ''' <summary> ''' Establishes a new database connection. ''' </summary> ''' <returns>A CODBCConnection containing the newly established connection.</returns> ''' <remarks>The CODBCConnection class implements the _CConnection interface which ''' is required by this method. ''' <para>If the connection cannot be established an exception will be thrown.</para></remarks> ''' <history> ''' [rbanks] 11/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Overrides Function getNewConnection() As _CConnection Dim conn As New CODBCConnection Try conn.Connection = New OdbcConnection conn.Connection.ConnectionString = m_connectionString conn.Connection.Open() Catch err As Exception Throw New DatabaseConnectionException(err.Message, err) End Try getNewConnection = conn 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 OdbcDataAdapter Dim aValue As Integer Dim row As System.Data.DataRow Dim p As OdbcParameter Dim x As OIDException Dim initvals() As Object = {1} Dim conn As CODBCConnection conn = Me.getConnection(Nothing) conn.AutoCommit = False conn.startTransaction() Try If DEBUG_MODE Then System.Diagnostics.Debug.WriteLine("Get OID A Value") End If da.SelectCommand = New OdbcCommand("select * from " & Me.OIDTable, conn.Connection, conn.Transaction) da.UpdateCommand = New OdbcCommand("UPDATE " & Me.OIDTable & " SET oidAValue = @oidAValue ", conn.Connection, conn.Transaction) p = da.UpdateCommand.Parameters.Add("@oidAValue", OdbcType.Int) p.SourceColumn = "oidAValue" da.InsertCommand = New OdbcCommand("INSERT INTO " & Me.OIDTable & " VALUES(@oidAValue) ", conn.Connection, conn.Transaction) p = da.InsertCommand.Parameters.Add("@oidAValue", OdbcType.Int) p.SourceColumn = "oidAValue" 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 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 OdbcDataAdapter Dim cb As OdbcCommandBuilder Dim aValue As Integer Dim connection As CODBCConnection connection = conn connection.AutoCommit = False Try da.SelectCommand = New OdbcCommand("select @@IDENTITY", connection.Connection, connection.Transaction) cb = New OdbcCommandBuilder(da) da.Fill(rs, "identity") If rs.Tables(0).Rows.Count = 0 Then Throw New IdentityValueException("Could not retrieve identity value. No value was returned.") 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 OdbcException 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 ODBC connection only a single ''' question mark (?) is returned.</remarks> ''' <history> ''' [rbanks] 23/01/2004 Created ''' </history> '''----------------------------------------------------------------------------- Public Overrides Function getParamHolder(ByVal i As Integer) As String Return "?" End Function '''----------------------------------------------------------------------------- ''' <summary> ''' See <see cref="P:AToMSFramework._CRelationalDatabase.getClauseStringTableAlias">_CRelationalDatabase</see>. ''' </summary> ''' <param name="table"></param> ''' <param name="pAlias"></param> ''' <returns></returns> ''' <remarks></remarks> ''' <history> ''' [rbanks] 12/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Overrides Function getClauseStringTableAlias(ByVal table As String, ByVal owner As String, ByVal pAlias As String) As String Return 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 CODBCConnection While ConnectionPool.Count > 0 conn = ConnectionPool.Pop conn.Dispose() End While m_disposed = True End If End If End Sub End Class '''----------------------------------------------------------------------------- ''' Project : AToMSFramework ''' Class : CMaxDBDatabase ''' '''----------------------------------------------------------------------------- ''' <summary> ''' Implementation of CRelationalDatabase for MaxDB Servers. ''' </summary> ''' <remarks>This class contains the specific functionality required for the ''' framework to interact with MaxDB databases. The only .NET provider is an ODBC connection ''' at this stage, so we just inherit from the existing ODBC database class for now. ''' </remarks> ''' <history> ''' [rbanks] 02/09/2004 Created ''' </history> '''----------------------------------------------------------------------------- Public Class CMaxDBDatabase Inherits CODBCDatabase Public Overrides Function useBracketsForJoins() As Boolean Return False End Function End Class --- NEW FILE: CODBCConnection.vb --- Imports AToMSFramework Imports System.Data.Odbc '''----------------------------------------------------------------------------- ''' Project : AToMSFramework ''' Class : CODBCConnection ''' '''----------------------------------------------------------------------------- ''' <summary> ''' Connection class for ODBC data sources ''' </summary> ''' <remarks><para>This class implements the <see cref="T:AToMSFramework._CConnection"/> interface and is used ''' to manage connections to ODBC 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] 28/11/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Class CODBCConnection Implements _CConnection Implements IDisposable '************************************************** 'Class: CConnection 'Author: Juan Carlos Alvarez '************************************************** Private m_connection As OdbcConnection Private m_autoCommit As Boolean Private m_started As Boolean Private m_manageTransactions As Boolean Private m_transaction As OdbcTransaction 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 ODBC Connection for the object. ''' </summary> ''' <history> ''' [rbanks] 28/11/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Property Connection() As OdbcConnection Get Connection = m_connection End Get Set(ByVal Value As OdbcConnection) m_connection = Value End Set End Property '''----------------------------------------------------------------------------- ''' <summary> ''' See <see cref="P:AToMSFramework._CConnection.AutoCommit">_CConnection</see>. ''' </summary> ''' <history> ''' [rbanks] 28/11/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> ''' <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> ''' <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> ''' <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 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 operating on the database connection ''' </summary> ''' <value></value> ''' <remarks></remarks> ''' <history> ''' [rbanks] 1/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public ReadOnly Property Transaction() As OdbcTransaction Get Transaction = m_transaction End Get End Property '''----------------------------------------------------------------------------- ''' <summary> ''' See <see cref="P: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 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> ''' <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 OdbcCommand Dim m_recordcount As Integer Dim cp As CSQLParameter Dim param As OdbcParameter Try 'Me.startTransaction() - transaction is started further up Debug.WriteLine(statement.SqlString) m_command.Connection = m_connection m_command.CommandText = statement.SqlString 'new bit for parameters For Each cp In statement.Parameters If Not cp.Ignore Then param = New OdbcParameter param.ParameterName = cp.Name param.OdbcType = CType(cp.Column.ProviderType, System.Data.odbc.OdbcType) param.Value = cp.Value m_command.Parameters.Add(param) End If Next m_command.Transaction = m_transaction m_recordcount = m_command.ExecuteNonQuery() If m_recordcount = 0 Then Throw New NothingUpdatedException("No records were affected") End If Catch err As OdbcException Throw err Catch err As Exception Throw err End Try End Sub '''----------------------------------------------------------------------------- ''' <summary> ''' See <see cref="M:AToMSFramework._CConnection.processSelectStatement">_CConnection</see>. ''' </summary> ''' <history> ''' [rbanks] 1/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- Public Function processSelectStatement(ByVal statement As CSqlStatement) As CResultset Implements _CConnection.processSelectStatement SyncLock GetType(CODBCConnection) Dim x As RetrieveException Dim rs As New CResultset Dim m_command As New OdbcCommand Dim param As OdbcParameter If DEBUG_MODE Then 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 OdbcParameter param.ParameterName = cp.Name param.OdbcType = CType(cp.Column.ProviderType, System.Data.odbc.OdbcType) param.Value = cp.Value m_command.Parameters.Add(param) End If Next Try Dim m_adapter As New OdbcDataAdapter(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 OdbcException 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 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 called") 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="P:AToMSFramework._CConnection.CloseConnection">_CConnection</see>. ''' </summary> ''' <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> ''' <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> ''' <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.getTablesSchema">_CConnection</see>. ''' </summary> ''' <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 OdbcCommand Dim dr As OdbcDataReader Dim dt As DataTable statement = "select * from " & tName Try cmd = New OdbcCommand(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 '''----------------------------------------------------------------------------- ''' <summary> ''' See <see cref="P:AToMSFramework._CConnection.startTransaction">_CConnection</see>. ''' </summary> ''' <history> ''' [rbanks] 1/12/2003 Created ''' </history> '''----------------------------------------------------------------------------- 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 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.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 --- NEW FILE: AF_ODBC.vbproj --- <VisualStudioProject> <VisualBasic ProjectType = "Local" ProductVersion = "7.10.3077" SchemaVersion = "2.0" ProjectGuid = "{DD36FC68-80E0-47F6-9C1D-00D1F8D59EBC}" > <Build> <Settings ApplicationIcon = "" AssemblyKeyContainerName = "" AssemblyName = "AF_ODBC" AssemblyOriginatorKeyFile = "" AssemblyOriginatorKeyMode = "None" DefaultClientScript = "JScript" DefaultHTMLPageLayout = "Grid" DefaultTargetSchema = "IE50" DelaySign = "false" OutputType = "Library" OptionCompare = "Binary" OptionExplicit = "On" OptionStrict = "Off" RootNamespace = "AF_ODBC" 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 = "CODBCConnection.vb" SubType = "Code" BuildAction = "Compile" /> <File RelPath = "CODBCDatabase.vb" SubType = "Code" BuildAction = "Compile" /> </Include> </Files> </VisualBasic> </VisualStudioProject> |