From 95a0e578da62a26a83166d896cb1982bc5025bf2 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Wed, 2 Nov 2022 09:01:42 +0100 Subject: [PATCH] WIP: Database with sql connection object --- Database/Adapters/MSSQLServer.vb | 76 ++++++++++++++++++-------------- Database/Database.vbproj | 1 + Database/Helpers.vb | 10 +++++ Database/IDatabase.vb | 5 ++- ZooFlow/Environment.vb | 4 +- 5 files changed, 58 insertions(+), 38 deletions(-) create mode 100644 Database/Helpers.vb diff --git a/Database/Adapters/MSSQLServer.vb b/Database/Adapters/MSSQLServer.vb index 604febc9..5da5bd88 100644 --- a/Database/Adapters/MSSQLServer.vb +++ b/Database/Adapters/MSSQLServer.vb @@ -264,78 +264,86 @@ Public Class MSSQLServer End Try End Function - ' - Public Function GetDatatable(SqlCommand As String) As DataTable Implements IDatabase.GetDatatable - Return GetDatatable(SqlCommand, QueryTimeout) + ''' + ''' Returns a Datatable for a SQL Statement + ''' + ''' SQL Command Text for Datatable (select XYZ from TableORView) + ''' A datatable + Public Function GetDatatable(pSqlCommand As String, Optional pTimeout As Integer = Constants.DEFAULT_TIMEOUT) As DataTable Implements IDatabase.GetDatatable + Using oSqlConnection = GetSQLConnection() + Return GetDatatableWithConnectionObject(pSqlCommand, oSqlConnection, TransactionMode.WithTransaction, Nothing, pTimeout) + End Using End Function ''' - ''' Returns a datatable for a sql-statement + ''' Returns a datatable for a SQL Statement ''' - ''' sqlcommand for datatable (select XYZ from TableORView) - ''' Returns a datatable - Public Function GetDatatable(SqlCommand As String, Timeout As Integer) As DataTable Implements IDatabase.GetDatatable + ''' SQL Command Object for Datatable (select XYZ from TableORView) + ''' A datatable + Public Function GetDatatable(pSqlCommandObject As SqlCommand, Optional pTimeout As Integer = Constants.DEFAULT_TIMEOUT) As DataTable Implements IDatabase.GetDatatable Using oSqlConnection = GetSQLConnection() - Return GetDatatableWithConnectionObject(SqlCommand, oSqlConnection, TransactionMode.WithTransaction, Nothing, Timeout) + Return GetDatatableWithConnectionObject(pSqlCommandObject, oSqlConnection, TransactionMode.WithTransaction, Nothing, pTimeout) End Using End Function - ' - Public Function GetDatatable(SqlCommand As String, Transaction As SqlTransaction, Optional Timeout As Integer = Constants.DEFAULT_TIMEOUT) As DataTable + Public Function GetDatatable(pSqlCommand As String, pTransaction As SqlTransaction, Optional pTimeout As Integer = Constants.DEFAULT_TIMEOUT) As DataTable Using oSqlConnection = GetSQLConnection() - Return GetDatatableWithConnectionObject(SqlCommand, oSqlConnection, TransactionMode.ExternalTransaction, Transaction, Timeout) + Return GetDatatableWithConnectionObject(pSqlCommand, oSqlConnection, TransactionMode.ExternalTransaction, pTransaction, pTimeout) End Using End Function - ' - Public Async Function GetDatatableAsync(SqlCommand As String, Optional Timeout As Integer = Constants.DEFAULT_TIMEOUT) As Task(Of DataTable) - Return Await Task.Run(Function() GetDatatable(SqlCommand, Timeout)) + Public Async Function GetDatatableAsync(pSqlCommand As String, Optional pTimeout As Integer = Constants.DEFAULT_TIMEOUT) As Task(Of DataTable) + Return Await Task.Run(Function() GetDatatable(pSqlCommand, pTimeout)) End Function - ' - Public Function GetDatatableWithConnection(SqlCommand As String, pConnectionString As String, Optional Timeout As Integer = Constants.DEFAULT_TIMEOUT) As DataTable + Public Function GetDatatableWithConnection(pSqlCommand As String, pConnectionString As String, Optional Timeout As Integer = Constants.DEFAULT_TIMEOUT) As DataTable Using oConnection = GetConnection(pConnectionString) - Return GetDatatableWithConnectionObject(SqlCommand, oConnection, Timeout:=Timeout) + Return GetDatatableWithConnectionObject(pSqlCommand, oConnection, pTimeout:=Timeout) End Using End Function - Public Function GetDatatableWithConnectionObject(SqlCommand As String, SqlConnection As SqlConnection, - Optional TransactionMode As TransactionMode = TransactionMode.WithTransaction, - Optional Transaction As SqlTransaction = Nothing, - Optional Timeout As Integer = Constants.DEFAULT_TIMEOUT) As DataTable - Dim oTransaction As SqlTransaction = MaybeGetTransaction(SqlConnection, TransactionMode, Transaction) + Public Function GetDatatableWithConnectionObject(pSqlCommand As String, pSqlConnection As SqlConnection, + Optional pTransactionMode As TransactionMode = TransactionMode.WithTransaction, + Optional pTransaction As SqlTransaction = Nothing, + Optional pTimeout As Integer = Constants.DEFAULT_TIMEOUT) As DataTable + Dim oSQLCommand As New SqlCommand(pSqlCommand) + Return GetDatatableWithConnectionObject(oSQLCommand, pSqlConnection, pTransactionMode, pTransaction, pTimeout) + End Function + + Public Function GetDatatableWithConnectionObject(pSqlCommandObject As SqlCommand, pSqlConnection As SqlConnection, + Optional pTransactionMode As TransactionMode = TransactionMode.WithTransaction, + Optional pTransaction As SqlTransaction = Nothing, + Optional pTimeout As Integer = Constants.DEFAULT_TIMEOUT) As DataTable + Dim oTransaction As SqlTransaction = MaybeGetTransaction(pSqlConnection, pTransactionMode, pTransaction) Dim oTable As New DataTable() With {.TableName = Constants.DEFAULT_TABLE} Try - Dim oAdapter As New SqlDataAdapter(New SqlCommand With { - .CommandText = SqlCommand, - .Connection = SqlConnection, - .Transaction = oTransaction, - .CommandTimeout = Timeout - }) + pSqlCommandObject.Connection = pSqlConnection + pSqlCommandObject.Transaction = oTransaction + pSqlCommandObject.CommandTimeout = pTimeout - Logger.Debug("GetDatatableWithConnectionObject: Running Query [{0}]", SqlCommand) + Using oAdapter As New SqlDataAdapter(pSqlCommandObject) + Logger.Debug("GetDatatableWithConnectionObject: Running Query [{0}]", pSqlCommandObject.CommandText) + oAdapter.Fill(oTable) + End Using - oAdapter.Fill(oTable) Catch ex As Exception Logger.Error(ex) - Logger.Warn("GetDatatableWithConnectionObject: Error in GetDatatableWithConnection while executing command: [{0}]", SqlCommand) + Logger.Warn("GetDatatableWithConnectionObject: Error in GetDatatableWithConnection while executing command: [{0}]", pSqlCommandObject) Throw ex Finally - MaybeCommitTransaction(oTransaction, TransactionMode) + MaybeCommitTransaction(oTransaction, pTransactionMode) End Try Return oTable End Function - ' Public Function ExecuteNonQuery(SQLCommand As String) As Boolean Implements IDatabase.ExecuteNonQuery Using oConnection = GetSQLConnection() Return ExecuteNonQueryWithConnectionObject(SQLCommand, oConnection, TransactionMode.WithTransaction, Nothing, QueryTimeout) End Using End Function - ' Public Function ExecuteNonQuery(SQLCommand As String, Timeout As Integer) As Boolean Implements IDatabase.ExecuteNonQuery Using oConnection = GetSQLConnection() Return ExecuteNonQueryWithConnectionObject(SQLCommand, oConnection, TransactionMode.WithTransaction, Nothing, Timeout) diff --git a/Database/Database.vbproj b/Database/Database.vbproj index b9f2d82c..5328db6b 100644 --- a/Database/Database.vbproj +++ b/Database/Database.vbproj @@ -99,6 +99,7 @@ + diff --git a/Database/Helpers.vb b/Database/Helpers.vb new file mode 100644 index 00000000..4d09d04b --- /dev/null +++ b/Database/Helpers.vb @@ -0,0 +1,10 @@ +Public Class Helpers + + Public Shared Function MaybeEscapeSQLCommand(pSQLCommand As String) As String + + + + End Function + + +End Class diff --git a/Database/IDatabase.vb b/Database/IDatabase.vb index a473b393..c7ea227f 100644 --- a/Database/IDatabase.vb +++ b/Database/IDatabase.vb @@ -1,4 +1,5 @@ Imports System.Data.Common +Imports System.Data.SqlClient Public Interface IDatabase ''' @@ -7,8 +8,8 @@ Public Interface IDatabase Property DBInitialized As Boolean Property CurrentConnectionString As String - Function GetDatatable(SqlCommand As String, Timeout As Integer) As DataTable - Function GetDatatable(SqlCommand As String) As DataTable + Function GetDatatable(SqlCommand As String, Optional Timeout As Integer = Constants.DEFAULT_TIMEOUT) As DataTable + Function GetDatatable(SqlCommand As SqlCommand, Optional Timeout As Integer = Constants.DEFAULT_TIMEOUT) As DataTable Function ExecuteNonQuery(SQLCommand As String, Timeout As Integer) As Boolean Function ExecuteNonQuery(SQLCommand As String) As Boolean diff --git a/ZooFlow/Environment.vb b/ZooFlow/Environment.vb index b902e618..10ba683f 100644 --- a/ZooFlow/Environment.vb +++ b/ZooFlow/Environment.vb @@ -3,8 +3,8 @@ Public Class Environment Public Property User As New State.UserState Public Property Settings As New State.SettingsState - Public Property Service As State.ServiceState + Public Property Service As New State.ServiceState Public Property Database As MSSQLServer Public Property DatabaseIDB As MSSQLServer - Public Property Modules As Dictionary(Of String, State.ModuleState) + Public Property Modules As New Dictionary(Of String, State.ModuleState) End Class