[VB.NET] verspillen van resources bij MySQL inserts..

Pagina: 1
Acties:
  • 531 views

Onderwerpen


Acties:
  • 0 Henk 'm!

  • gepebril
  • Registratie: November 2001
  • Laatst online: 28-03-2023
Hallo,

Ik probeer een insert te doen in een database vanuit een DataTable. Iets wat niet zo moeilijk en duidelijk te vinden is in de handleidingen. Alleen lijkt dit in deze taal bij repeterende insert alleen maar te kunnen door veel resources onnodig te gebruiken. In alle handleidingen dien je namelijk je insert query mee te geven met het open van de database. M.a.w. voor elke insert dien je
1) definieer Insert string
2) Open database
3) Voor insert uit
4) Sluit DB connectie.
Zie hier http://dev.mysql.com/tech...tation-in-vbnet-apps.html (listing 16)
Een andere methodiek die ik gevonden had deed het zo
code:
1
2
3
4
5
6
7
8
Dim myInsertQuery As String
conn = New MySqlConnection(connStr)
conn.Open()
myInsertQuery = "INSERT INTO orders (salesid, customerId, code, amount) Values(100, 200,  & indata(0) & "," & indata(2) & ")"
Dim myCommand As New MySqlCommand(myInsertQuery)
myCommand.Connection = conn
myCommand.ExecuteNonQuery()
conn.Close()

En dient dus voor elke Insert loop geheugenruimte voor twee variabelen te reserveren en dit kan natuurlijk aardig oplopen bij een loop van b.v. 500 keer op een klein apparaatje....

Is er geen efficientere methode om dit te doen?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
gepebril schreef op vrijdag 13 augustus 2010 @ 00:08:
Alleen lijkt dit in deze taal bij repeterende insert alleen maar te kunnen door veel resources onnodig te gebruiken.
Wat versta jij onder veel resources :?
gepebril schreef op vrijdag 13 augustus 2010 @ 00:08:
In alle handleidingen dien je namelijk je insert query mee te geven met het open van de database.
Nee :? Je opent een connectie, voert je X-queries uit en sluit de connectie.
gepebril schreef op vrijdag 13 augustus 2010 @ 00:08:
M.a.w. voor elke insert dien je
1) definieer Insert string
2) Open database
3) Voor insert uit
4) Sluit DB connectie.
Je zult toch echt gaan geen van die stappen ontkomen; je moet een querystring hebben, je hebt een (open) connectie nodig, je zult de query moeten uitvoeren en je zult (als je het netjes doet) de connectie moeten sluiten. Feitelijk moet je zelfs nog de nodige objecten disposen, maar daar heb je using voor.
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Using Conn As New SqlConnection("Server=MyServer;Database=MyDB;Trusted_Connection=True;")
    Conn.Open()
    Using Cmd As New SqlCommand("insert into mytable (firstname, lastname) values (@firstname, @lastname)", Conn)
        Cmd.Parameters.Add("firstname", SqlDbType.VarChar, 50)
        Cmd.Parameters.Add("lastname", SqlDbType.VarChar, 50)
        'Here we go...
        For i As Integer = 0 To 500
            Cmd.Parameters("firstname").Value = String.Format("Firstname{0}", i)
            Cmd.Parameters("lastname").Value = String.Format("Lastname{0}", i)
            Cmd.ExecuteNonQuery()
        Next
    End Using
    Conn.Close()
End Using

Dit is even voor MSSQL (en dus niet MySQL) maar voor MySQL is het niet anders... Je hebt net zo goed een connectie (MySQLConnection) nodig, een MySQL Command enzovoorts. Ook gebruik ik hier een parametrized Query, maar je kunt net zo goed in de lus even de string opbouwen (al heb je dan kans op SQL injection als je niet oppast etc. en dus zou ik sowieso de parameterized methode adviseren).
gepebril schreef op vrijdag 13 augustus 2010 @ 00:08:
En dient dus voor elke Insert loop geheugenruimte voor twee variabelen te reserveren en dit kan natuurlijk aardig oplopen bij een loop van b.v. 500 keer op een klein apparaatje....
Twee héle variabelen nog wel! Poehee!
En je beseft dat je die variabelen kunt her-gebruiken he?
gepebril schreef op vrijdag 13 augustus 2010 @ 00:08:
Is er geen efficientere methode om dit te doen?
Wat versta je onder efficiënter? Minder regels code wellicht?

[ Voor 49% gewijzigd door RobIII op 13-08-2010 02:05 ]

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!

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 13-07 01:53

Korben

() => {};

RobIII schreef op vrijdag 13 augustus 2010 @ 01:43:
[...]
Wat versta je onder efficiënter? Minder regels code wellicht?
Psst. Je laatste regel code in de buitenste Using-clause is overbodig (de Dispose van de SqlConnection doet hetzelfde). Als je die regel code weglaat is het misschien een stuk sneller :P 8)7

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 15:14
RobIII schreef op vrijdag 13 augustus 2010 @ 01:43:
Twee héle variabelen nog wel! Poehee!
En je beseft dat je die variabelen kunt her-gebruiken he?
Doe de compiler dat niet al voor je? ^^

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Korben schreef op vrijdag 13 augustus 2010 @ 07:03:
[...]

Psst. Je laatste regel code in de buitenste Using-clause is overbodig (de Dispose van de SqlConnection doet hetzelfde). Als je die regel code weglaat is het misschien een stuk sneller :P 8)7
Ik ben meer van het expliciet sluiten. De Using doet 't anders idd voor je maar ik hou daar niet zo van. Kwestie van smaak. En dat "sneller"; ik neem aan dat je sarcastisch bent? :P

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!

  • gepebril
  • Registratie: November 2001
  • Laatst online: 28-03-2023
Wat versta jij onder veel resources :?
Ik zie Dim staan en steeds voor dezelfde variable. Ik nam aan dat er dan steeds een opnieuw geheugenruimte wordt aangemaakt. En dat deze wordt vastgehouden tot dat het programma wordt gesloten. Indien je steeds Insert doet kan dat voor Windows Mobile devices met beperkt geheugen snel oplopen. Dus vandaar ook de opmerking efficiënt.

Voor de rest mooie additionele info m.b.t. queries we gaan het even uitvoerig bestuderen, vooral dat parameterized is nieuw en interessant.

Acties:
  • 0 Henk 'm!

  • gepebril
  • Registratie: November 2001
  • Laatst online: 28-03-2023
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Using Conn As New SqlConnection("Server=MyServer;Database=MyDB;Trusted_Connection=True;")
    Conn.Open()
    Using Cmd As New SqlCommand("insert into mytable (firstname, lastname) values (@firstname, @lastname)", Conn)
        Cmd.Parameters.Add("firstname", SqlDbType.VarChar, 50)
        Cmd.Parameters.Add("lastname", SqlDbType.VarChar, 50)
        'Here we go...
        For i As Integer = 0 To 500
            Cmd.Parameters("firstname").Value = String.Format("Firstname{0}", i)
            Cmd.Parameters("lastname").Value = String.Format("Lastname{0}", i)
            Cmd.ExecuteNonQuery()
        Next
    End Using
    Conn.Close()
End Using
Bedankt voor het code voorbeeld. Denk dat het in voorbeelden toch iets praktischer is om voor variabele namen niet de zelfde namen te geven als de velden in de database, dit schept verwarring. Daarnaast zie ik ook nog deze zelfde namen terugkomen met een hoofdletter, klopt dat wel?

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

gepebril schreef op vrijdag 13 augustus 2010 @ 19:11:
[...]


Denk dat het in voorbeelden toch iets praktischer is om voor variabele namen niet de zelfde namen te geven als de velden in de database, dit schept verwarring.
Euh, nee, dat is juist retehandig. Vooral als jij of een ander over een paar weken, maanden of wellicht jaren de code weer bekijkt.
Daarnaast zie ik ook nog deze zelfde namen terugkomen met een hoofdletter, klopt dat wel?
Dat is een voorbeeld, zodat je "Firstname0" en "Lastname0" tot en met "Firstname500" en "Lastname500" in je tabel krijgt.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
gepebril schreef op vrijdag 13 augustus 2010 @ 18:19:
[...]

Ik zie Dim staan en steeds voor dezelfde variable. Ik nam aan dat er dan steeds een opnieuw geheugenruimte wordt aangemaakt.
Sowieso bestaan variabelen enkel tot het einde van hun scope (MSDN) en nooit langer. En hoe kleiner de scope, hoe minder lang ze bestaan.
gepebril schreef op vrijdag 13 augustus 2010 @ 19:11:
Denk dat het in voorbeelden toch iets praktischer is om voor variabele namen niet de zelfde namen te geven als de velden in de database, dit schept verwarring.
Volgens jouw voorstel:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Using Conn As New SqlConnection("Server=MyServer;Database=MyDB;Trusted_Connection=True;")
    Conn.Open()
    Using Cmd As New SqlCommand("insert into mytable (firstname, lastname) values (@blue, @tuesday)", Conn)
        Cmd.Parameters.Add("blue", SqlDbType.VarChar, 50)
        Cmd.Parameters.Add("tuesday", SqlDbType.VarChar, 50)
        'Here we go...
        For i As Integer = 0 To 500
            Cmd.Parameters("blue").Value = "Rob"
            Cmd.Parameters("tuesday").Value = "Janssen"
            Cmd.ExecuteNonQuery()
        Next
    End Using
    Conn.Close()
End Using

Nee, dat is handig! d:)b ;)
gepebril schreef op vrijdag 13 augustus 2010 @ 19:11:
Daarnaast zie ik ook nog deze zelfde namen terugkomen met een hoofdletter, klopt dat wel?
Dat legt CodeCaster hierboven al uit, het is maar een voorbeeld. Zoals ik al vaker (en in eerdere topics van je heb gezegd): het scheelt als je weet waar je mee bezig bent en als je snapt wat ergens staat. Ik was gewoon te lam om een array van 500 namen te verzinnen voor een voorbeeld en dus maakte ik gewoon "testdata" die ge-insert zou worden in de tabel. En die data was, toevallig, "Firstname0", "Firstname1"... maar had net zo goed CustArray[i].Firstname kunnen zijn natuurlijk. With all due respect; het ontbreekt je gewoon nog aan (basis)kennis en als ik jou was zou ik eens beginnen met een goed boek of een goede tutorial.

[ Voor 75% gewijzigd door RobIII op 13-08-2010 19:41 ]

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!

  • gepebril
  • Registratie: November 2001
  • Laatst online: 28-03-2023
Bedankt voor alle hulp. Ik was in de war gebracht door '@' teken deze wordt in o.a. in Perl gebruikt om arrays aan te duiden.
Daarnaast blijf ik van mening dat goede naamstelling bij variabelen veel vragen voorkomt en vandaar dat ik je tweede voorbeeld zeer toe juig.
Tot op heden heb ik slechts enkele keren Visual Basic dienen te gebruiken en vermijd het waar ik kan om dat ik het liefst zo veel mogelijk doe met een taal om dit soort verwarringen te voorkomen. Ben nog een beetje van voor het Object Oriented programming en probeer er een beetje onderuit te komen. En ik heb het idee dat ik het voor mijn kleine projectjes ook niet echt "nodig"heb. Helaas heb je niet alles in de hand. Had er 20 jaar geleden bij een Philips stage aan het begin van mijn carrière ook probs mee toen ik VAX, Unix en CDOS door elkaar diende te gebruiken. Denk dat je wel kan voorstellen wat dat opleverde.
Basiskennis is een woord, wat is in jouw ogen het boek dat je dient te snappen alvorens je de titel basiskennis machtig bent?

En tja, handicaps. denk dat ik wel een beetje dyslectisch ben. Ach ja Helen Keller was doof en blind kon toch veel, Michael Jackson en Paul Mc Cartney kunnen geen noot lezen en zijn toch goed terecht gekomen, maar ja die zaten niet op dit forum ;)

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Zo diehard OO is dit nog niet, dus stel je niet aan :> ;)

Test gewoon rustig wat je met de huidige hints kan bouwen, en maak je niet al te druk om een variabele meer of minder als daar geen aanleiding (opvallend veel geheugengebruik bv.) voor is.

edit:
En o ja, hou alsjeblieft die namen hetzelfde. Als je een bankafschrift gaat archiveren stop je het toch ook niet opeens in de map genaamd 'oude kerstkaarten'?
[/sufste voorbeeld ooit]

Als je ooit iets met kleuren gaat doen is blue al bezet, dus moet je je kleur opeens Piet gaan noemen :+

[ Voor 38% gewijzigd door Voutloos op 13-08-2010 20:43 ]

{signature}


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
gepebril schreef op vrijdag 13 augustus 2010 @ 20:18:
Daarnaast blijf ik van mening dat goede naamstelling bij variabelen veel vragen voorkomt en vandaar dat ik je tweede voorbeeld zeer toe juig.
Het kan haast niet anders dan dat ik je hier verkeerd begrijp, maar ik lees hier toch echt dat je het tweede voorbeeld beter vindt? Seriously? Dus "blue" en "tuesday" vind jij duidelijkere namen voor variabelen waar een voornaam en achternaam in horen te zitten dan "firstname" en "lastname"?
gepebril schreef op vrijdag 13 augustus 2010 @ 20:18:
Basiskennis is een woord, wat is in jouw ogen het boek dat je dient te snappen alvorens je de titel basiskennis machtig bent?
Geen idee; ik heb geen VB.Net boeken gelezen (hoewel er hier wel een stuk of 5 op de plank staan :X ) maar je zou eens kunnen beginnen te lezen in [Alg] Centraal boekentopic - part II :Y)
gepebril schreef op vrijdag 13 augustus 2010 @ 20:18:
Michael Jackson en Paul Mc Cartney kunnen geen noot lezen en zijn toch goed terecht gekomen, maar ja die zaten niet op dit forum ;)
Ik kan ook geen noot lezen maar waag me dan ook niet (meer) aan muziek maken ;) :P
Waarmee ik je dus niet wil ontmoedigen in je programmeerambities hoor :>

[ Voor 48% gewijzigd door RobIII op 13-08-2010 20:45 ]

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!

  • gepebril
  • Registratie: November 2001
  • Laatst online: 28-03-2023
Het kan haast niet anders dan dat ik je hier verkeerd begrijp, maar ik lees hier toch echt dat je het tweede voorbeeld beter vindt? Seriously? Dus "blue" en "tuesday" vind jij duidelijkere namen voor variabelen waar een voornaam en achternaam in horen te zitten dan "firstname" en "lastname"?
Ik denk dat we inderdaad langs elkaar praten. Wat ik bedoel te zeggen als b.v. een veld in een DB de naam 'customer' heeft en er is ook een variable customer hoe kan je dan bij nieuwe code weten of de code refereert aan het veld in de db of aan de variable. .............
Overigens krijg ik het niet 100% met jou voorbeeld aan de praat. Als ik de query uitvoer krijg ik als foutmelding Error Column 'veld1' cannot be null' wat raar is, want net daarvoor print ik de waarde uit die duidelijk niet null is....... Ik heb de variabele namen even eenvoudig gekozen om de werking te testen.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Using Cmd As New MySqlCommand("insert into voorbeeld (veld1, veld2, veld3, veld4) values (@a, @b, @c, @d)", Conn)
   Cmd.Parameters.Add("a", MySqlDbType.VarChar, 6)
   Cmd.Parameters.Add("b", MySqlDbType.VarChar, 6)
   Cmd.Parameters.Add("c", MySqlDbType.VarChar, 14)
   Cmd.Parameters.Add("d", MySqlDbType.VarChar, 3)
   For i = 0 To scanTable.Rows.Count - 1
     scanRow = scanTable.Rows(i)
     Cmd.Parameters("a").Value = "000005"
     Cmd.Parameters("b").Value = variable2
     Cmd.Parameters("c").Value = scanRow(1)
     Cmd.Parameters("d").Value = scanRow(3)
     MsgBox(Cmd.Parameters("a").Value)
     Cmd.ExecuteNonQuery()
   Next
End Using

Acties:
  • 0 Henk 'm!

  • Onno
  • Registratie: Juni 1999
  • Niet online
Moet je moet bij het toevoegen van de parameters niet @a, @b, enz. als naam gebruiken in plaats van a, b, ...?

Acties:
  • 0 Henk 'm!

  • gepebril
  • Registratie: November 2001
  • Laatst online: 28-03-2023
Onno schreef op vrijdag 13 augustus 2010 @ 22:24:
Moet je moet bij het toevoegen van de parameters niet @a, @b, enz. als naam gebruiken in plaats van a, b, ...?
Zoals dit ......
Visual Basic .NET:
1
2
   Cmd.Parameters.Add("@a", MySqlDbType.VarChar, 6)
   Cmd.Parameters("@a").Value = "000005" 

Dacht ik later ook aan, leverde helaas hetzelfde resultaat op.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
gepebril schreef op vrijdag 13 augustus 2010 @ 22:35:
[...]

Zoals dit ......
Visual Basic .NET:
1
2
   Cmd.Parameters.Add("@a", MySqlDbType.VarChar, 6)
   Cmd.Parameters("@a").Value = "000005" 

Dacht ik later ook aan, leverde helaas hetzelfde resultaat op.
Nee, zoals dit en dit. Komaan; je hebt zelfs nog een opmerking gemaakt over die @. Echter is er een subtiel verschil voor MySQL; precies de reden waarom ik aangaf dat ik een voorbeeld voor MSSQL had gegeven en niet voor MySQL. In sommige gevallen gebruik je geen @firstname, @lastname etc. maar bijv. ?firstname, ?lastname of zelf alleen maar ?, ? waarbij in het laatste geval de volgorde belangrijk is waarin je de parameters specificeert. Linksom of rechtsom; ik ben het handje-houden in ieder geval ondertussen aardig beu. Als je 2 minuten googled en zelf eens wat moeite doet moet je hier prima uit kunnen komen.

[ Voor 4% gewijzigd door RobIII op 13-08-2010 23:14 ]

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

Pagina: 1

Dit topic is gesloten.