I have to wrote a protected function extension on dataset in my program.
It should take consideration of "_" character in dataset.getttype.name to split information. Then i should have enough information to compute my own connnectionString variable Name :
dataset.gettype.name = {ExtentionFormat_dataset_versionnumber} (example : ESTX_DataSet_1)
so ESTX is the dataset.gettype.name.split("_")(0) value and 1 is the dataset.gettype.name.split("_")(2) value.
According to my own work, Connectionstring Variable Name should be ESTX_ConnectionString_1.
Then this is easy to create some dataset sub extention, like Set_ConnectionString and Get_ConnectionString, based on GetConnectionStringName.
Imports System.Runtime.CompilerServices
Module DataSetExtentions
<Extension()>
Protected function GetConnectionStringName(MyDataset as dataset) as string
dim _szextention as string = MyDataSet.GetType.Name.Split("_")(0)
dim _szVersion as string = MyDataSet.GetType.Name.Split("_")(2)
Return _szextention & "_ConnectionString_" & _szVersion
end function
<Extension()>
Protected function Get_ConnectionString(MyDataSet as dataSet) as string
return My.Settings(MyDataSet.GetConnectionStringName)
end function
<Extension()>
Protected sub Set_ConnectionString(myDataSet as dataset, Myvalue as string)
My.Settings(MyDataSet.GetConnectionStringName) = myValue
end sub
end module
So using the code should be :
imports System.Reflection
imports System.oledb
public Class DataLayer
Private ds as dataset
Private _connectionString as string
Private _connection as oledbConnection
Private _TableManager As Object
Public sub New(File as string)
dim _szExtension as string = system.io.file.getExtention(File)
_connectionstring = "Provider=...;DataSource=" & File & ";" & ...
_connection = new oledbconnection(_connectionstring)
SyncLock my.setting(ds.GetConnectionStringName)
ds = new intangible_dataset(_conn)
ds.Set_ConnectionString = _connectionstring
_classname = System.Reflection.Assembly.GetExecutingAssembly().GetName.Name _
.Replace(" ", "_") & "." & DataSet.GetType.Name & _
"TableAdapters.TableAdapterManager"
_TableManager = System.Reflection.Assembly.GetExecutingAssembly.CreateInstance(_classname)
InitTableManager()
_connection.open
dim dtConfig as datatable = loadTable("CONFIG")
dim szVersion as string = dtConfig.Rows(0)("Version")
_connection.close
ds.Dispose
ds = nothing
CType(_TableManager, IDisposable).Dispose()
_TableManager = nothing
dim tDs as system.type
dim _className as string
ds = System.Reflection.Assembly.GetExecutingAssembly.CreateInstance(_classname)
ds.Set_ConnectionString = _connectionstring
_classname = System.Reflection.Assembly.GetExecutingAssembly().GetName.Name _
.Replace(" ", "_") & "." & DataSet.GetType.Name & _
"TableAdapters.TableAdapterManager"
_TableManager = System.Reflection.Assembly.GetExecutingAssembly.CreateInstance(_classname)
InitTableManager()
End SyncLock
end sub
Private Sub InitTableManager()
_TableManager.Connection = _Connection
For Each _table As DataTable In _Dataset.Tables
Dim _Adapter As Object = Nothing
Try
Dim _classname As String = Assembly.GetExecutingAssembly() _
.GetName.Name.Replace(" ", "_") & "." &
_Dataset.GetType.Name & "TableAdapters." &
_table.TableName & "TableAdapter"
_Adapter = Assembly.GetExecutingAssembly.CreateInstance(_classname)
CallByName(_TableManager, _table.TableName & "TableAdapter", CallType.Set, _Adapter)
#if false then
Dim pinfo As PropertyInfo =
_Adapter.GetType.GetProperties(BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance).Where(Function(w) w.Name = "Connection").FirstOrDefault
If pinfo IsNot Nothing Then
pinfo.SetValue(_Adapter, _TableManager.Connection)
Else
Stop
End If
#End if
Catch ex As Exception
Debug.Print(ex.Message)
stop
End Try
Next
End Sub
Public function LoadTable(aTableName as string, optional clone as boolean = false) as datatable
dim _Adapter as object
if _connection.state = close then _connection.Open()
dim _propertyName as string = aTableName & "TableAdapter"
_Adapter = CallByName(_TableManager, _propertyName, CallType.Get)
Dim dt As DataTable = Nothing
If clone Then
dt = _ds.Tables(aTableName).Clone
Else
dt = _ds.Tables(aTableName)
End If
SyncLock dt
_Adapter.Fill(dt)
End SyncLock
return dt
end function
Public readonly DataSet as Dataset
get
return _ds
end get
end property
End class