[vb.NET] dbKlasse gebruiken in meerdere forms

Pagina: 1
Acties:

  • Blizard
  • Registratie: September 2001
  • Niet online
Situatie : Ik heb één hoofdformulier met een panel en een paar buttons. Wanneer ik op een button klik, wordt het panel opgevuld met de componenten die op een ander formulier staan (frmHoofd, frmGegevens, .. etc). Nu heb ik ook een databaseklasse waar de formulieren een object naartoe mogen sturen zodat de databaseklasse zorgt dat het object in de database terecht komt.
In de databaseklasse zit een ingekapselde Dataset die bij het laden van het programma wordt geladen.
Nu is echter het probleem dat ik vanuit het panel niet aan de databaseklasse (de instantie ervan die aangemaakt wordt in Hoofd) kan...
Ook het doorgeven als parameter lukt niet.
code:
1
Additional information: Object reference not set to an instance of an object


Wanneer ik op elk formulier een nieuwe instantie aanmaak van de databaseklasse is het gevolg dat de dataset x-aantal keer wordt opgevuld, wat natuurlijk niet de bedoeling is ...

Iemand eventueel een paar tips hoe ik te werk moet gaan ?! :/

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Maak die DataSet een (al dan niet static) member van een aparte class ?

code:
1
2
3
4
class dbStuff
{
     public static DataSet myDataSet;
}


code:
1
2
3
4
5
private void Button1_Click(object sender, EventArgs e)
{
    // hier kan je aan de dataset
    dbStuff.myDataSet;
}


oid.

https://fgheysels.github.io/


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 26-05 23:39

mulder

ik spuug op het trottoir

- Begin anders eens bij het begin, en volg wat tutorials.

Je zou de instantie van de databaseklasse gewoon door moeten kunnen geven. Maar je ontwerp lijkt zo niet helemaal kosjer, kijk ook eens naar N-Tier.

oogjes open, snaveltjes dicht


  • Blizard
  • Registratie: September 2001
  • Niet online
whoami schreef op 11 februari 2004 @ 14:50:
Maak die DataSet een (al dan niet static) member van een aparte class ?

oid.
De dataset zit in een module (kan hem niet static maken ?) En in de dbKlasse ga ik de dataset opvullen.
code:
1
'Static' is not valid on a member variable declaration.
- Begin anders eens bij het begin, en volg wat tutorials.
Je zou de instantie van de databaseklasse gewoon door moeten kunnen geven. Maar je ontwerp lijkt zo niet helemaal kosjer, kijk ook eens naar N-Tier.
Ik heb al een aantal tutorials+boeken+... gelezen, maar kan nergens iets vinden over database/klassen/datasets etc ... en dan zeker niet om door te geven aan andere forms. Hoop dat je dit begrijpt. (kijk eens naar N-Tier ?)

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
In VB.NET hebben ze een andere naam aan static gegeven: shared.

https://fgheysels.github.io/


  • Blizard
  • Registratie: September 2001
  • Niet online
whoami schreef op 11 februari 2004 @ 15:08:
In VB.NET hebben ze een andere naam aan static gegeven: shared.
Shared noch Static werken ... (had shared ook al ff gedaan). Maar het zou handiger zijn moest ik op één of andere manier de instantie van de database-klasse kunnen doorgeven naar de desbetreffende Forms.
Of dat ik bij de constructor van de database-objecten niet iedere keer de dataset opnieuwe opvul.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Blizard schreef op 11 februari 2004 @ 15:14:
[...]

Shared noch Static werken ... (had shared ook al ff gedaan).
Hoezo dat werkt niet? Je kan toch een shared member maken in een class?
Maar het zou handiger zijn moest ik op één of andere manier de instantie van de database-klasse kunnen doorgeven naar de desbetreffende Forms.
Of dat ik bij de constructor van de database-objecten niet iedere keer de dataset opnieuwe opvul.
Ik snap je bedoeling niet echt.
Je hebt dus een database-class? Wat is het doel van die class?
Wat doen je forms met die database-class?

https://fgheysels.github.io/


  • Blizard
  • Registratie: September 2001
  • Niet online
whoami schreef op 11 februari 2004 @ 15:19:
Ik snap je bedoeling niet echt.
Je hebt dus een database-class? Wat is het doel van die class?
Wat doen je forms met die database-class?
Database-class : kan je een object naartoe sturen, de databaseklasse gaat zorgen dat het via een instert in database terecht komt ? (Of is dit niet de goede manier van werken ?)

code:
1
2
3
4
5
6
7
  Public Sub New()
    cm = New OleDbCommand("SELECT * FROM tblTest", cnDatabase)
    da = New OleDbDataAdapter(cm)
    cnDatabase.Open()
    da.Fill(dataS, "Table1")
    cnDatabase.Close()
  End Sub


Dit is de constructor van de database-klasse ...

Volgens mij haalt het niks uit om dan de dataset Static te declareren ? Aangezien je gewoon de Table1 een paar keer opnieuw gaat vullen ? Of zie ik het verkeerd ?

(Wat is de algemene manier van werken wanneer je zaken naar een database wil schrijven ?)

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 22:24

gorgi_19

Kruimeltjes zijn weer op :9

@whoami: waarom declareer je hem alleen maar static? Kan je niet beter er gelijk eeen Singleton van maken?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Waarom vul je die DataSet steeds opnieuw in je constructor?

Waarom maak je de class niet ongeveer als volgt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class  PersonenDAL
{
      private OleDbConnection _conn;
      private OleDbDataAdapter _da;
  
      public PersonenDAL()
      {
            _conn = new OleDbConnection( Configuration.AppSettings["dsn"] );
            _da = new OleDbDataAdapter(_conn);
            cmdInsertPersoon = new OleDbCommand();
            // init hier verder ...
            ...
            _da.SelectCommand = cmdSelectPersoon;
            _da.InsertCommand = cmdInsertCommand;
      }

      public void Update( DataSet aDataSet )
      {
           _da.Update (aDataSet.GetChanges());
      }
}

Waarom doe je niet zoiets ongeveer zoals bovenstaande?

Ik doe het meestal als volgt:
- Ik maak een Data Access Layer; mijn classes maken geen gebruik van een DataTable of DataSet. Eén instance van zo'n DAL class representeert 1 -in dit geval bv.- persoon.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class PersoonDAL
{
      private int  _persoonId;
      private string _persoonNaam;

      private OleDbConnection _conn;
      private OleDbCommand   _cmd;
      private OleDbDataAdapter _da;

      public void InsertPersoon()
      {
            _cmd.CommandText = "cm_insertperson";
            _cmd.CommandType = CommandType.StoredProcedure;
            ...
            _cmd.Parameters["@p_naam"].Value = this._persoonNaam;

            ....
            _cmd.ExecuteNonQuery();
      }
}

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
gorgi_19 schreef op 11 februari 2004 @ 15:30:
@whoami: waarom declareer je hem alleen maar static? Kan je niet beter er gelijk eeen Singleton van maken?
Dat hangt er een beetje van af. Misschien wel, moeilijk te zeggen eigenlijk, want we kennen de echte situatie niet.
Als er slechts 1 zo'n DBClass mag zijn wel ja.

https://fgheysels.github.io/


  • Blizard
  • Registratie: September 2001
  • Niet online
whoami schreef op 11 februari 2004 @ 15:33:
[...]
Dat hangt er een beetje van af. Misschien wel, moeilijk te zeggen eigenlijk, want we kennen de echte situatie niet.
Als er slechts 1 zo'n DBClass mag zijn wel ja.
Ik geef zeker toe dat m'n kennis omtrent vb.NET en ADO zeer beperkt is. Maar wil toch even stellen dat ik al heel wat tutorials + boeken heb doorgelezen. Dus is beetje jammer dat je dat als antwoord krijgt.
Het probleem is een beetje van : waar doe ik wat, en hoe doe ik het ?

Situatie : Je hebt een database met leden in. Je wil op een formulier leden tonen/importeren/wijzigen/deleten/manueel invoeren etc. Bijkomende moeilijkheid is dat het formulier een panel bevat en waar de inhoud verandert naargelang er op een knop geklikt wordt en het panel een pnl.Controls.Add(pnlAnderForm) bevat.

Daarnaast heb ik een basis-klasse voor een lid (met getters en setters, maar voorts niks meer). Dan heb ik een database-klasse voor lid. (ik heb ook nog andere klassen dan lid, waar ik iedere keer ook een database-klasse voor maak !?).
Maar nu komen er natuurlijk een paar vragen : Hoe zorg ik ervoor dat iedereen aan de juiste table in de dataset kan ? Waar vul ik de dataset ? Als ik een lid zoek, moet dit dan met een dataset opnieuw te vullen of met een dataview ? ...
Bij het inserten van een lid in de db-klasse, maak ik dan best gebruik van insert-query, of van een row-add van de dataview ...

*ziet door de bomen het bos niet meer* Er zijn 1001 mogelijkheden, maar zijn er dan geen regels van wat 'een betere' manier is ? Of een schema van hoe alles zou moeten verlopen ?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Blizard schreef op 12 februari 2004 @ 21:59:
[...]

Ik geef zeker toe dat m'n kennis omtrent vb.NET en ADO zeer beperkt is. Maar wil toch even stellen dat ik al heel wat tutorials + boeken heb doorgelezen. Dus is beetje jammer dat je dat als antwoord krijgt.
Het probleem is een beetje van : waar doe ik wat, en hoe doe ik het ?
Wat vind je dan jammer aan mijn antwoord?
De reply die jij gequote hebt, was een antwoord van mij op een vraag van gorgi_19 over het al dan niet gebruiken van een singleton pattern.
Daarnaast heb ik een basis-klasse voor een lid (met getters en setters, maar voorts niks meer). Dan heb ik een database-klasse voor lid. (ik heb ook nog andere klassen dan lid, waar ik iedere keer ook een database-klasse voor maak !?).
IMO is dit een beetje overkill. Als die 'basis-klasse' enkel gegevens bijhoudt en verder niets doet, wat is het nut dan van die class? Voor wat gebruik je die class ?
Je kan toch evengoed een class maken die gegevens bijhoudt over een een lid, en daarnaast zorg je ervoor dat diezelfde class ook de verantwoordelijkheid heeft om dat lid te gaan saven/deleten/etc...... (Zie mijn eerdere post daarvoor).
Maar nu komen er natuurlijk een paar vragen : Hoe zorg ik ervoor dat iedereen aan de juiste table in de dataset kan ?
Deze vraag snap ik niet?
Als ik een lid zoek, moet dit dan met een dataset opnieuw te vullen of met een dataview ? ...
Een dataview is een view op een datatable. Als je een datatable aan een DataGrid hangt:
code:
1
MyDataGrid.DataSource = MyDataTable;

bv, dan gaat het eigenlijk niet de DataTable zijn die je aan die grid koppelt, maar de Default DataView van die DataTable. (Dit gebeurt achter de schermen).
Bij het inserten van een lid in de db-klasse, maak ik dan best gebruik van insert-query, of van een row-add van de dataview ...
Als je een row toevoegt aan een datatable (of dataview), dan zit die row enkel maar in het geheugen, en niet in de databank.
Als je de gewijzigde datarows van een datatable naar een databank wilt persisten, dan zal je zowiezo de Update functie van een data-adapter moeten aanroepen.
Die Update functie zorgt er dan voor dat voor iedere row het juiste command (UpdateCommand, InsertCommand, ....) van die DataAdapter uitgevoerd wordt voor die row. (De DataAdapter gaat daarvoor de RowState property van die datarow gaan checken).

Als je bv dit doet:
code:
1
2
3
DataRow dr = MyDataTable.NewRow();
dr["naam"] = "blaat";
MyDataTable.Rows.Add (dr);

Dan heb je wel een nieuwe DataRow aangemaakt, maar die zit nog niet in de Databank zelf. Die datarow bestaat enkel maar in het geheugen.
Het is pas als je de Update method aanroept van een DataAdapter , dat die row echt gesaved wordt:
code:
1
MyDataAdapter.Update (MyDataTable.GetChanges());

https://fgheysels.github.io/


  • Blizard
  • Registratie: September 2001
  • Niet online
whoami schreef op 12 februari 2004 @ 22:31:
Wat vind je dan jammer aan mijn antwoord?
De reply die jij gequote hebt, was een antwoord van mij op een vraag van gorgi_19 over het al dan niet gebruiken van een singleton pattern.
De allereerste reply. En het komt wel vaker voor op Got dat je eerst 2 jaar bezig moet zijn met alle zaken vooraleer je een vraag mag stellen omdat je de basics nog niet echt door hebt. (maar is verdomd lastig om alles werkende te krijgen aan de hand van een boek/tutorial)
IMO is dit een beetje overkill. Als die 'basis-klasse' enkel gegevens bijhoudt en verder niets doet, wat is het nut dan van die class? Voor wat gebruik je die class ?
Je kan toch evengoed een class maken die gegevens bijhoudt over een een lid, en daarnaast zorg je ervoor dat diezelfde class ook de verantwoordelijkheid heeft om dat lid te gaan saven/deleten/etc...... (Zie mijn eerdere post daarvoor).
De klasse dient inderdaad enkel voor gegevens bij te houden en te controleren of de gegevens wel correct zijn (vb : indien kleiner nr dan tien > throw error). Wanneer ik alles in één klasse gooi ga ik voor ieder nieuw lid-object een nieuwe data-adapter aanmaken etc ? ... (de constructor die je hierboven aanhaalde)

Nog bijkomend vraagje : om tekstvakjes/comboboxen etc op te vullen. Kan ik dan best gebruik maken van bindings ? Want wanneer de gebruiker dan een veld verandert, schrijft hij deze veranderingen ook weg in de dataset (is niet echt gewenst op sommige plaatsen)
Alvast thanks voor je hulp!

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Blizard schreef op 13 februari 2004 @ 08:04:
[...]

De allereerste reply.
Mjah, ik zie niet in wat er mis is met de allereerste reply?
En het komt wel vaker voor op Got dat je eerst 2 jaar bezig moet zijn met alle zaken vooraleer je een vraag mag stellen omdat je de basics nog niet echt door hebt. (maar is verdomd lastig om alles werkende te krijgen aan de hand van een boek/tutorial)
Nee hoor, we verwachten gewoon dat de topicstarter zelf ook enige moeite doet om tot een oplossing te komen, zodat hij ook bijleert.
Als je hier gewoon je code of je vraagt neerplempt, zonder zelf enige moeite te willen ondernemen, en je alles aan anderen overlaat, dan wordt dat niet echt in dank afgenomen.
Iedereen mag hier vragen stellen, maar er wordt dus wel gelet op de 'instelling' van de topicstarter. Maar dat is hier in dit geval toch geen probleem?
De klasse dient inderdaad enkel voor gegevens bij te houden en te controleren of de gegevens wel correct zijn (vb : indien kleiner nr dan tien > throw error). Wanneer ik alles in één klasse gooi ga ik voor ieder nieuw lid-object een nieuwe data-adapter aanmaken etc ? ... (de constructor die je hierboven aanhaalde)
Mja, je kan het natuurlijk doen met 1 dbClass. Die kan er dan bv zo uit zien:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class PersondbClass
{

     private static OleDbConnection       _conn;
     private static OleDbDataAdapter     _da;

     

     public static Update( DataSet ds )
     {
           _da.Update (ds.GetChanges());
     }

     public DataTable GetPersons()
     {
            // vul een datatable met gewenste personen
            // en return deze
     }

     public PersonData GetPersonData( int personId)
     {
            // haal 1 persoon op, en return een PersonData object
     }

     public SavePerson( PersonData p )
     {
           // save 1 persoon naar de DB
     }

}

Bovenstaande class is natuurlijk verre van compleet. Er missen nog dingen zoals een constructor, de methods zijn er niet allemaal, etc....
Het is gewoon de bedoeling dat je je een beeld kunt vormen.
Je kunt dus voor ieder 'type' objecten dat je hebt (bv. Personen, Orders, etc.... ), een dbClass maken dat de database operaties voor dat type object (die class) op zich neemt.
Met bovenstaand idee zou je het dan bv als volgt kunnen aanpakken in je code:

code:
1
2
3
PersonData aPerson = new PersonData();
// ....
PersondbClass.SavePerson (aPerson);
Nog bijkomend vraagje : om tekstvakjes/comboboxen etc op te vullen. Kan ik dan best gebruik maken van bindings ? Want wanneer de gebruiker dan een veld verandert, schrijft hij deze veranderingen ook weg in de dataset (is niet echt gewenst op sommige plaatsen)
Dat hangt er van af. Als jij een situatie hebt waarin je denkt dat het beter is om DataBindings te gebruiken, gebruik die dan.
Als je een situatie hebt waar die bindings niet nodig of niet gewenst zijn, dan gebruik je ze niet.

https://fgheysels.github.io/


  • Blizard
  • Registratie: September 2001
  • Niet online
whoami schreef op 13 februari 2004 @ 08:44:
code:
1
2
3
PersonData aPerson = new PersonData();
// ....
PersondbClass.SavePerson (aPerson);
Hier zit eigenlijk het grootste probleem. Ik kan niet zomaar PersondbClass.SavePerson doen (ook al is deze public) ik moet eerst een object aanmaken van die klasse om dan een saveperson te gaan doen ?! Terwijl ik die nieuwe instantie eigenlijk niet nodig heb, maar gewoon een person wil gaan toevoegen ...
(zijn er tutorials die goed beschrijven hoe te werken met klassen en databases ?! In een boek kom je beiden tegen, maar nooit samen in een geheel)

-offtopic : bedoelde eigenlijk de tweede reply ;) -

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Blizard schreef op 13 februari 2004 @ 09:14:
[...]

Hier zit eigenlijk het grootste probleem. Ik kan niet zomaar PersondbClass.SavePerson doen (ook al is deze public) ik moet eerst een object aanmaken van die klasse om dan een saveperson te gaan doen ?!
Niet als je die methods static maakt. (Iets wat ik ging doen in m'n voorbeeld, maar uiteindelijk toch vergeten was. :o )
Terwijl ik die nieuwe instantie eigenlijk niet nodig heb, maar gewoon een person wil gaan toevoegen ...
(zijn er tutorials die goed beschrijven hoe te werken met klassen en databases ?! In een boek kom je beiden tegen, maar nooit samen in een geheel)
In de MSDN (Patterns & Practices oid) vind je wel eea dacht ik. Zoek eens op n-tier, data access layer, etc....

https://fgheysels.github.io/

Pagina: 1