[C#] Datatables row updaten

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 20-09 15:40
Hey medetweakers,

Ik ben nog redelijk nieuw met C#. Momenteel probeer ik een database aan mijn c# webapp te koppelen. Echter ben ik er nog niet helemaal achter wat nou een goeie manier is om de update en insert functie af te handelen.

Momenteel heb ik een default.table klasse. Deze heeft functies als getData, insertRecord, updateRecord etc. Voor elke tabel in de database is een klasse aanwezig. Elk van deze klassen extenden van de default table.
De getData functie werkt perfect, echter lukt de insertRecord niet helemaal.

Ik werk met datatable/datasets. Ik dacht dus eerst even een losse datarow aan te maken, te vullen met gegevens en deze mee te geven aan de insertRecord functie. Echter ging dit leuke idee niet op.
Om dit te realiseren, moet ik eerst de hele tabel nabouwen(dus de columns, typen etc opgeven), oftewel veel werk waar ik geen zin in heb.

Ik kan natuurlijk er ook voor kiezen om een array mee te geven en dan gewoon een query uit te voeren, echter vraag ik me eerst nu af of dat van die dataset dan niet makkelijker kan....

Dus medetweakers, zie ik een vette functie van die datatable/dataset over het hoofd, of moet ik gewoon een query schrijven?

Google en me eigen boek kunnen het antwoord niet geven.. ik hoop jullie wel!

Acties:
  • 0 Henk 'm!

  • boe2
  • Registratie: November 2002
  • Niet online

boe2

'-')/

Volledig nabouwen is inderdaad niet nodig. Een row aanmaken om te vullen met data, gebaseerd op een bestaande tabel:
C#:
1
Datarow datarow = datatable.NewRow()

dan kan je gewoon de verschillende velden opvullen met data. Daarna moet je die row ook effectief toevoegen in je datatable:
C#:
1
datatable.rows.add(datarow)


Als je met een DataAdapter werkt hoef je daarna enkel nog de gegevens in de DB op te slaan met een update() command.

[ Voor 15% gewijzigd door boe2 op 10-03-2009 16:15 ]

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Hier kon je niets in vinden :?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 20-09 15:40
Ja dat kwam ik zelf ook tegen en dat klonk eerst allemaal heel vet...

Maar als ik gewoon een rij wil toevoegen, moet ik dan eerst een nutteloze query uitvoeren die 1 rij voor me ophaalt, zodat ik een tabel heb? Of is daar ook een trucje voor..

Acties:
  • 0 Henk 'm!

  • boe2
  • Registratie: November 2002
  • Niet online

boe2

'-')/

C# heeft geen ingebouwde glazen bol. Zonder je databank enige info te vragen kan je inderdaad niet al teveel te weten komen over de structuur van je tabel ;).
Indien je bij het oproepen van je klasse een lege tabel wil (geen data dus) kan je best een query in de trend van "WHERE ID = -1" uitvoeren, die dan 0 rows teruggeeft.

[ Voor 4% gewijzigd door boe2 op 10-03-2009 16:22 ]

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.


Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 20-09 15:40
Jammer ik had gehoopt dat je gewoon simpel een nieuwe datarow kon toevoegen, zonder kennis van die tabel te hebben. Waarom zou je ook kennis daar van willen hebben? Maar goed, daarom kon ik het dus niet vinden.

Dus nu maar gaan kiezen om bij het aanmaken van zon databasetable klasse automagisch ook gelijk zelf zon lege tabel laten constructen, of gewoon een query schrijven.

Ik vind het namelijk een beetje jammer dat je een extra query er voor moet uitvoeren, misschien wel principes, maja.

Acties:
  • 0 Henk 'm!

  • boe2
  • Registratie: November 2002
  • Niet online

boe2

'-')/

Ofwel
Om dit te realiseren, moet ik eerst de hele tabel nabouwen(dus de columns, typen etc opgeven), oftewel veel werk waar ik geen zin in heb.
Ofwel een query schrijven die die informatie netjes voor je ophaalt. Wat voor oplossing had je dan juist gehoopt? Je datarow structuur MOET overeenkomen met je tabel, anders ga je hem nooit terug kunnen invoegen.

[ Voor 15% gewijzigd door boe2 op 10-03-2009 16:37 ]

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.


Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 20-09 15:40
Ik had gehoopt snel een datarow te kunnen aanmaken, zonder kennis te hebben van de hele tabel.Die datarow pomp ik dan in de in die functie en die moet het dan verder af gaan handelen met dat echte updaten.

Om nu een nieuwe regel toe te voegen, moet ik eerst die tabel opvragen, daar die nieuwe regel toevoegen en vervolgens updaten. Tot het regel toevoegen gebeurd nu buiten mijn insertRecord functie, oftewel die insertRecord functie begint nu aardig nuttenloos te worden...

Dan kan ik er nog voor kiezen om het gewoon in een ander formaat op te vragen, maar als ik snel een regel opvraag met mijn getdata functie, moet ik die datarow weer omzetten naar een ander formaat... ook geklooi dus..

Hoe los jij zoiets op dan?

Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 20-09 15:40
Ik ben vandaag weer even verder gegaan met de stof die je me gaf:

In de constructor van bijvoorbeeld de users tabel wordt nu een nieuw datatabel attribuut aangemaakt en gevuld met de query user_id=-1 zoals jij aangaf. Zo dacht ik, eenmalig een query nodig te hebben en niet voor elke insert.

Daarna maak ik een nieuwe row aan in die tabel en geef die mee aan de insertRecord functie, die vervolgens hem daadwerkelijk add. Daarna roep ik de update functie van de dataAdapter aan. Echter krijg ik nu de melding dat ik geen geldige insertcommand heb opgegeven, oftewel moet ik dan ook nog zelf de query gaan schrijven?

Wat is hier beter aan, dan zelf gewoon een query te schrijven en die gewoon uit te voeren zonder datasets?
Ik snap namelijk niet echt de filosofie achter datasets etc..

Edit, om even wat meer richting in het gesprek te geven hieronder de code:

InsertFunctie
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void insertRecord(DataRow row) {
        SqlConnection conn  = getDBConnection();

        try {
            conn.Open();
            SqlDataAdapter da   = new SqlDataAdapter();
            dataTable.Rows.Add(row);
            row.AcceptChanges();
            row.BeginEdit() ;
            row.EndEdit() ;
            
            da.Update(dataTable);
           
            //da.Update(tableName,tableName);
        } catch (SqlException ex) {
            errorHandler.addSystemError("SQL ERROR: INSERT QUERY: " + ex);
        } finally {
            conn.Close();
        }
}


Die zo wordt aangeroepen:

C#:
1
2
3
4
5
DataRow newRow = usersTable.dataTable.NewRow();
        newRow["first_name"]    = "keesje";
        newRoW["last_name"] = "kleuter";

        usersTable.insertRecord(newRow);

[ Voor 37% gewijzigd door BlackHawkDesign op 11-03-2009 10:37 ]


Acties:
  • 0 Henk 'm!

  • Amras
  • Registratie: Januari 2003
  • Laatst online: 13:12
Misschien zou je eens kunnen kijken naar typed datasets. In dit geval maak je een XSD die informatie over de structuur van je tabellen bevat, en kun je daarna strong typed datarows aanmaken en opslaan. Met de XSD editor van visual studio is dit ook erg eenvoudig, omdat je de tabellen er op kunt slepen en de onderliggende XML netjes gegenereerd wordt. :)

Acties:
  • 0 Henk 'm!

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 13-09 21:30
Pagina: 1