Ok, ale kód který tu budu uvádět není kompletní, chybí tam ošetření problémů s otevíráním spojení atp. Na to ale přijdete při testování. Ze základu tu mám třídu datového kontextu. Té se předá připojovací řetězec při inicializaci a následně lze z vlastnosti Pripojeni získat spojení do databáze:
Public Class DatovyKontext
Public Sub New(ByVal pripojovaciRetezec As String)
Pripojeni = New Data.SqlClient.SqlConnection(pripojovaciRetezec)
Pripojeni.Open()
End Sub
Private pripojeni_ As Data.SqlClient.SqlConnection
Public Property Pripojeni() As Data.SqlClient.SqlConnection
Get
Return pripojeni_
End Get
Set(ByVal value As Data.SqlClient.SqlConnection)
pripojeni_ = value
End Set
End Property
End Class
Dále tu máme základní bázovou třídu pro datové třídy. Nedělá nic jiného, než že schraňuje v proměnné kontext pro své potomky právě třídu datového kontextu (tím pádem ji vůbec nezajímá co v kontextu je, jen uchovává jeho instanci):
Public MustInherit Class DatovaBazovaTrida
Public Sub New(ByVal kontext As DatovyKontext)
Me.kontext = kontext
End Sub
Protected kontext As DatovyKontext
End Class
Teď následuje ukázka jak bázovou třídu a její odkaz na kontext používat v své nové datové třídě (dědí z bázové třídy a při komunikace s databází používá připojení z kontextu poskytnutého právě bázovou třídou):
Public Class MojeDatovaTrida1
Inherits DatovaBazovaTrida
Public Sub New(ByVal kontext As DatovyKontext)
MyBase.New(kontext)
End Sub
Public Sub ZavolejDatabazi()
Dim prikaz = kontext.Pripojeni.CreateCommand()
prikaz.CommandText = "exec sp_MojeUlozenaProcedura"
prikaz.ExecuteNonQuery()
End Sub
End Class
Nyní už následuje jen příklad použití. Kód nejprve vytvoří datový kontext (připojení k databázi), pak vytvoří instanci datové třídy, které předá připojení uschované v datovém kontextu a nakonec na inicializované datové třídě zavolá požadovaný příkaz:
Module Module1
Sub Main()
Dim kontext = New DatovyKontext("Server=.\SQLEXPRESS;Database=Test1;uid=login;pwd=heslo;")
Dim datovaTrida = New MojeDatovaTrida1(kontext)
datovaTrida.ZavolejDatabazi()
End Sub
End Module
Uff, to jsem se rozepsal :-). Je to popsané trochu stručně, ale snad se skrz to prokoušete. Pokud ne, ptejte se. Toto řešení se používá velmi často, je hodně obecné a elegantní. Například lze využívat jeden datový kontext pro více tříd, je možné do datového kontextu implementovat transakce atp. atp....
|