Databank aanspreken, MySQL query met Exec

Ik las onlangs een commentaar van Benoit Minisini waarin hij (vertaald) zegt:

Doe nooit:

sql = "INSERT INTO klant (naam) VALUES ('" & TextBox1.Text & "')"
res = mDatabase.conn.Exec(sql)

maar doe:

res = mDatabase.conn.Exec("INSERT INTO klant (naam) VALUES (&1)", TextBox1.Text)

Voorbeeld met een nieuw project, graphical application met: DB access.

Table test bevat velden:

  • naam: varchar30
  • opm: varchar20
  • tijd: timestamp
' Gambas class file

PRIVATE sMaxRecs AS String
PRIVATE resQuery AS Result

PRIVATE $hConTest AS NEW Connection

PUBLIC SUB _new()

END

PUBLIC SUB Form_Open()

WITH $hConTest
.Type = "mysql"
.Host = "localhost"
.Login = "app"
.Password = "test"
.Name = "testtable"
END WITH
TRY $hConTest.Close
TRY $hConTest.Open
IF isTestConnect()
btInsert1.Enabled = TRUE
btInsert2.Enabled = TRUE
btInsert3.Enabled = TRUE
ENDIF

END

PUBLIC SUB isTestConnect() AS Boolean

IF $hConTest THEN
RETURN $hConTest.Opened
ELSE
RETURN FALSE
ENDIF

END

PUBLIC SUB btInsert1_Click()

DIM sSql AS String

sSql = "INSERT INTO test (naam) VALUES ('" & TextBox1.Text & "')"
DEBUG sSql
resQuery = $hConTest.Exec(sSql)
DEBUG resQuery.Available

END

PUBLIC SUB btInsert2_Click()

resQuery = $hConTest.Exec("INSERT INTO test (naam) VALUES (&1)", TextBox2.Text)

END

PUBLIC SUB btInsert3_Click()

DIM sSql AS String

sSql = "INSERT INTO test (naam) VALUES (&1)"
resQuery = $hConTest.Exec(sSql, TextBox2.Text)

END

FMain

form

Run

Run

De code onder knop 1 geeft volgende foutmelding:

Failed

De code onder knop 2 werkt (is gemaakt volgens opmerking boven).

Knop 3 gebruikt string sSql om query toch eerst op te bouwen.

'Om meer dan 1 veld in te vullen code van knop 3 vervangen door volgende:

PUBLIC SUB btInsert3_Click()

DIM sSql AS String

sSql = "INSERT INTO test (naam, opm) VALUES (&1, &2)"
resQuery = $hConTest.Exec(sSql, TextBox2.Text, TextBox3.Text)
END

Ook in een select kan dat gebruikt worden, bv:

sSql = "SELECT tijd FROM test WHERE naam = &1 AND opm = &2"
resQuery = $hConTest.Exec(sSql, TextBox2.Text, TextBox3.Text)
Message.Info(resQuery!tijd)

(kan toegevoegd worden aan knop 3 code)

Leave a Reply

You must be logged in to post a comment.