Visualizza post

Questa sezione ti permette di visualizzare tutti i post inviati da questo utente. N.B: puoi vedere solo i post relativi alle aree dove hai l'accesso.


Topics - swan

Pagine: [1]
1
Programmazione (Gambas 2) / input date/mask edit?
« il: 01 Luglio 2009, 10:54:53 »
a quanto vedo non c'è un input per la data (datetime) giusto?
nemmeno per fare quello che in VB6 era un maskedit? in modo da avere un "inputbox" che si presenti __/__/____ pronto per l'inserimento di una data?

ciao
max

2
Programmazione (Gambas 2) / classe per controllo parametri query
« il: 01 Luglio 2009, 00:53:45 »
è giusto la prima prova che faccio con il Gambas ed è inerente agli ultimi messaggi sulle query, ho provato a fare una piccola classe chiamata CParm

Codice: [Seleziona]

PRIVATE $Params AS String[]
PRIVATE $Values AS String[]
PRIVATE $Sql AS String

PUBLIC SUB _new(Query AS String)
  ME.Reset()
  $Sql = Query
END

PUBLIC SUB _free()
  $Params.Clear()
  $Params = NULL
  $Values.Clear()
  $Values = NULL
END

PUBLIC SUB Reset()
  $Sql = ""
  $Params = NEW String[]
  $Values = NEW String[]
END

PUBLIC SUB Add(ParamName AS String, Valor AS String)
  IF CheckAdd(ParamName) THEN
    $Params.Add(UCase$(ParamName))
    $Values.Add(Valor)
  ENDIF
END

PRIVATE FUNCTION CheckAdd(ParamName AS String) AS Boolean
DIM P AS String
  IF ParamName THEN    
    FOR EACH P IN $Params
      IF P = UCase$(ParamName) THEN
        Message.Warning("Parametro duplicato!")
        RETURN FALSE
      ENDIF
    NEXT
    RETURN TRUE
  ELSE
    Message.Warning("Il parametro deve avere un nome!")
    RETURN FALSE
  ENDIF
END

PUBLIC FUNCTION Query() AS String
DIM I AS Integer
DIM wSql AS String = $Sql
  IF $Sql THEN
    IF CheckParam() THEN  
        FOR I = 0 TO $Params.Count - 1
          SELECT CASE TypeOf($Values[i])
          CASE 2, 3, 4, 5
            'Numero intero
            wSql = Replace(wSql, "@" & $Params[i], $Values[i], gb.Case)
          CASE 6, 7
            'Numero decimale
            wSql = Replace(wSql, "@" & $Params[i], Replace($Values[i], ",", "."), gb.Case)
          CASE 8
            'Data
            wSql = Replace(wSql, "@" & $Params[i], "'" & $Values[i] & "'", gb.Case)
          CASE 9
            'Stringa
            wSql = Replace(wSql, "@" & $Params[i], "'" & Replace($Values[i], "'", "''") & "'", gb.Case)
          END SELECT          
        NEXT    
        RETURN wSql
    ELSE
      RETURN ""
    ENDIF
  ELSE
    Message.Warning("Non è stata passata la query!")
    RETURN ""
  ENDIF
END

PRIVATE FUNCTION CheckParam() AS Boolean
DIM P AS String
  IF InStr($Sql, "@") <> 0 THEN
    IF $Params.Count > 0 THEN      
      FOR EACH P IN $Params
        IF InStr($Sql, "@" & P, 0, gb.Case) = 0 THEN
          Message.Warning("Il parametro " & P & " non è stato inserito nella query passata!")          
          RETURN FALSE
        ENDIF
      NEXT
      RETURN TRUE
    ELSE
      Message.Warning("Non sono stati specificati i parametri!")
      RETURN FALSE
    ENDIF
  ELSE  
    IF $Params.Count > 0 THEN
      Message.Warning("Impostare nella query passata i parametri!")      
    ELSE
      Message.Info("Non sono stati impostati i parametri.")
    ENDIF
    RETURN FALSE
  ENDIF
END



utilizzata in questo modo:

DIM Parametri AS NEW CParm("UPDATE Articoli SET Desc = @Desc, Prezzo = @Pz, DataModifica = @DataM WHERE Cod = @Cod")
DIM Prezzo AS Float = 12.5
DIM wSql AS String
 
  Parametri.Add("Cod", "Articolo1")
  Parametri.Add("Desc", "DescrizioneArticolo")
  Parametri.Add("Pz", Prezzo)  
  Parametri.Add("DataM", Format(Date(Now), "dd/mm/yyyy"))  
  wSql = Parametri.Query()

su wSql ho la query che 'dovrebbe' non aver problemi.
Visto che sono acerbo di Gambas ho visto negli esempi che con la sub _new e _free di dichiaravano costruttore e distruttore della classe, ma non sono riuscito a fare un'overload del _new.
Come si fanno l'overload?

ciao
max

3
Programmazione (Gambas 2) / query injection
« il: 30 Giugno 2009, 14:41:13 »
ciao a tutti,
scusate se inizio sempre con "in ADO.Net" facevo/faccio ma è per farmi capire meglio. Cmq, in Ado.Net c'era la possibilità di utilizzare i Parameters per difendersi da query injection (qualcuno ne faceva riferimento nei post riguardanti problema di update di una stringa contente l'apostrofo), ho visto che in un'altro post c'era un'esempio di come fare un'exec che era tipo:

conn.exec(,"mioCampo = &valore",)

c'è in questo modo un controllo sul valore che non avrei facendo una query:

wsql = "SELECT * FROM WHERE mioCampo = '" & valore & "'"

non è tanto della possibilità che mi droppano una tabella che mi preoccupo visto il programmino che vorrei fare quanto di come controllare l'eventuale errore.

ciao
max

4
Programmazione (Gambas 2) / Connection
« il: 29 Giugno 2009, 23:13:16 »
Passato da programmare con VB6 e Access (ma non del tutto abbandonato) a VB.Net/C# e ADO.Net, con qualche divagazione di WPF ho preso la buona abitudine di aprire e chiudere sempre le connessioni (in modo da evitare anche veri e propri errori a runtime per troppe connessioni con processi lanciati asincroni, con Access non capitava ma passato alle ADO.Net si) (insomma sono il vostro programmatore ideale, tutto M$).
Giovedì passato, dopo l'ennesimo virus, ho deciso che nel pc di casa non c'era più posto per WinXP e mi sono così deciso ad installare Linux (non in dualboot, solo e soltanto linux, che se no non ho speranze di imparare ad usarlo) e ovviamente non ho potuto fare a meno una volta scoperto di installare anche Gambas.
Guardando l'esempio contenuto per mostrare l'interfacciamento ad un database vedo che la connessione viene lasciata aperta per tutta la durata del programma. E' perchè si tratta di un'esempio “scolastico” o non c'è bisogno di chiudere sempre le connessioni un po' come avveniva utilizzando le DAO in VB6?

Ps. molto gratificante approdare su piattaforma Linux e trovarsi difronte ad uno strumento così completo per cominciare a programmare, chi se lo sarebbe aspettato un RAD su Linux :)! In più ritrovando aspetti del VB6 e del VB.Net senza essere MONO.

Ps2. Complimenti anche per il forum sembra che sarà molto più semplice di quanto pensavo provare a fare un primo progettino.

Grazie Max

Pagine: [1]