Page 1 sur 1

Quelques commandes pour accéder à une base SQL

Publié : jeu. 27/oct./2005 10:30
par Gillou
Pour ceux que ça intéresse, voila quelques commandes pour accéder à une base SQL

Vous pouvez bien sûr en faire une librairie, ou ce que vous voulez, voila :D

à la fin vous trouverez les commandes mises en oeuvre

Code : Tout sélectionner

Procedure DB_Connect(DataBase.s, User.s, Password.s) ; Retourne l'identifiant de la base de donées (DataBaseID)
    Global list, SQL.s
    If InitDatabase() = 0 : ProcedureReturn 0 : EndIf
    db = OpenDatabase(#PB_Any, DataBase, user, password)
    ProcedureReturn db
EndProcedure

Procedure DB_CountRow(Table.s) ; Retourne le nombre de ligne de la table
    db = DatabaseQuery("SELECT * FROM " + table)
    SQL = "SELECT * FROM " + table
    If db
        FirstDatabaseRow()
        NextDatabaseRow()
        Repeat
            ligne = ligne + 1
        Until NextDatabaseRow() = 0
        ProcedureReturn ligne
    Else
        ProcedureReturn db
    EndIf
EndProcedure

Procedure DB_CountColumn(Table.s) ; Retourne le nombre de colonne de la table
    db = DatabaseQuery("SELECT * FROM " + table)
    SQL = "SELECT * FROM " + table
    If db
        FirstDatabaseRow()
        ProcedureReturn DatabaseColumns()
    Else
        ProcedureReturn db
    EndIf
EndProcedure

Procedure DB_CreateTable(Table.s, ColumnText.s) ; Permet de créer une table
    ; ColumnText.s="NomCol.type;NomCol.type;..."
    ; type[(Ncaractere[,Ndecimal])]
    ; type : int(Nbre de chiffre), decimal(Nbre de chiffre, Nbre de décimale), numeric(Nbre de chiffre), char(Nbre de caractère), varchar(Nbre de caractère)
    ; char -> chaine fixe ; varchar -> chaine variable
    ; ex: "Nom.char(8);Prénom.varchar(8);Age.int(3)"
    ; vous pouvez aussi spécifier les colonnes primaires...
    
    ncol = CountString(ColumnText, ".")
    For a = 1 To ncol
        If a = 1
            col$ = StringField(StringField(ColumnText, a, ";"), 1, ".") + " " + StringField(StringField(ColumnText, a, ";"), 2, ".")
        Else
            col$ = col$ + ", " + StringField(StringField(ColumnText, a, ";"), 1, ".") + " " + StringField(StringField(ColumnText, a, ";"), 2, ".")
        EndIf
    Next
    SQL = "CREATE TABLE " + table + " (" + col$ + ")"
    ProcedureReturn DatabaseQuery("CREATE TABLE " + table + " (" + col$ + ")")
EndProcedure

Procedure DB_DeleteTable(Table.s) ; Permet de supprimer une table
    SQL = "DROP TABLE " + table
    ProcedureReturn DatabaseQuery("DROP TABLE " + table)
EndProcedure

Procedure DB_InsertRow(Table.s, RowText.s) ; Permet d'insérer une ligne : RowText="1;2;2;bonjour;3;coucou..." 1=numero de colonne ; 2=texte
    db = DatabaseQuery("SELECT * FROM " + table)
    SQL = "SELECT * FROM " + table
    If db
        RowText=ReplaceString(RowText,"\","\\")
        ni = CountString(RowText, ";")
        For a = 1 To ni Step 2
            If a = 1
                col$ = DatabaseColumnName(Val(StringField(RowText, a, ";")))
            Else
                col$ = col$ + ", " + DatabaseColumnName(Val(StringField(RowText, a, ";")))
            EndIf
        Next
        
        For a = 1 To ni Step 2
            If DatabaseColumnType(Val(StringField(RowText, a, ";"))) = 2
                If a = 1
                    text$ = Chr(34) + StringField(RowText, a + 1, ";") + Chr(34)
                Else
                    text$ = text$ + ", " + Chr(34) + StringField(RowText, a + 1, ";") + Chr(34)
                EndIf
            Else
                If a = 1
                    text$ = StringField(RowText, a + 1, ";")
                Else
                    text$ = text$ + ", " + StringField(RowText, a + 1, ";")
                EndIf
            EndIf
        Next
        SQL = "INSERT INTO " + table + " (" + col$ + ") VALUES (" + text$ + ")"
        ProcedureReturn DatabaseQuery("INSERT INTO " + table + " (" + col$ + ") VALUES (" + text$ + ")")
    Else
        ProcedureReturn db
    EndIf
EndProcedure

Procedure DB_UpdateRow(Table.s, PrimaryColumn.l, PrimaryColumnText.s, Column.l, Update.s) ; la colonne reférence fait référence à une des colonnes primaires de la base (de préférence)
    db = DatabaseQuery("SELECT * FROM " + table)
    SQL = "SELECT * FROM " + table
    If db
        If DatabaseColumnType(column) = 2
            update = Chr(34) + update + Chr(34)
        EndIf
        If DatabaseColumnType(PrimaryColumn) = 2
            PrimaryColumnText = Chr(34) + PrimaryColumnText + Chr(34)
        EndIf
        SQL = "UPDATE " + table + " SET " + DatabaseColumnName(column) + " = " + update + " WHERE " + DatabaseColumnName(PrimaryColumn) + " = " + PrimaryColumnText
        ProcedureReturn DatabaseQuery("UPDATE " + table + " SET " + DatabaseColumnName(column) + " = " + update + " WHERE " + DatabaseColumnName(PrimaryColumn) + " = " + PrimaryColumnText)
    Else
        ProcedureReturn db
    EndIf
EndProcedure

Procedure DB_DeleteRow(Table.s, PrimaryColumn.l, PrimaryColumnText.s) ; Permet de supprimer une ligne
    db = DatabaseQuery("SELECT * FROM " + table)
    SQL = "SELECT * FROM " + table
    If db
        If DatabaseColumnType(PrimaryColumn) = 2
            PrimaryColumnText = Chr(34) + PrimaryColumnText + Chr(34)
        EndIf
        SQL = "DELETE FROM " + table + " WHERE " + DatabaseColumnName(PrimaryColumn) + " = " + PrimaryColumnText
        ProcedureReturn DatabaseQuery("DELETE FROM " + table + " WHERE " + DatabaseColumnName(PrimaryColumn) + " = " + PrimaryColumnText)
    Else
        ProcedureReturn db
    EndIf
EndProcedure

Procedure DB_List(Table.s, Column.l, Sort.l) ; Met en mémoire les valeurs de la table sans changer l'ordre de la table : 1 ordre alphanumérique : 2 inverse : autre pas de trie (Initialisation obligatoire : DB_Connect)
    ncol = DB_CountColumn(Table)
    nlig = DB_CountRow(Table)
    If ncol
        Dim DB.s(nlig, ncol)
        
        If sort = 1 ; tri dans l'ordre alphabétique ou numérique
            tri$ = " ORDER BY " + DatabaseColumnName(column)
        ElseIf sort = 2 ; tri à l'inverse de l'ordre alphabétique ou numérique
            tri$ = " ORDER BY " + DatabaseColumnName(column) + " DESC"
        Else
            tri$ = ""
        EndIf
        SQL = "SELECT * FROM " + table + tri$
        db = DatabaseQuery("SELECT * FROM " + table + tri$)
        If db
            FirstDatabaseRow()
            NextDatabaseRow()
            For a = 0 To nlig - 1
                For b = 0 To ncol - 1
                    If DatabaseColumnType(b) = 1
                        db(a, b) = Str(GetDatabaseLong(b))
                    ElseIf DatabaseColumnType(b) = 2
                        db(a, b) = ReplaceString(GetDatabaseString(b),"\\","\")
                    ElseIf DatabaseColumnType(b) = 3
                        db(a, b) = StrF(GetDatabaseFloat(b))
                    EndIf
                Next
                NextDatabaseRow()
            Next
            ProcedureReturn ncol * nlig
        Else
            ProcedureReturn db
        EndIf
    Else
        ProcedureReturn 0
    EndIf
EndProcedure

Procedure.s DB_GetValue(Column.l, Row.l) ; Retourne la valeur de la cellule choisie (Initialisation obligatoire : DB_Connect, DB_List)
    ProcedureReturn db(Row, Column)
EndProcedure

Procedure DB_Sort(Table.s, Column.l, Sort.l) ; Met la table dans l'ordre souhaitée, Mise en ordre physique de la base : 1 ordre alphanumérique : 2 inverse : autre pas de trie (Initialisation obligatoire : DB_Connect)
    DB_List(Table, column, sort)
    ncol = DB_CountColumn(Table)
    nlig = DB_CountRow(Table)
    For a = 0 To nlig - 1
        DB_DeleteRow(table.s, Column, db(a, column))
    Next
    For a = 0 To nlig - 1
        For b = 0 To ncol - 1
            If b = 0
                text.s = Str(b) + ";" + db(a, b)
            Else
                text.s = text + ";" + Str(b) + ";" + db(a, b)
            EndIf
        Next
        p = DB_InsertRow(table.s, text)
        If p = 0
            ProcedureReturn 0
        EndIf
    Next
    ProcedureReturn 1
EndProcedure

Procedure DB_ListTable(DataBaseID) ; Si OK : retourne le nombre de tables contenues dans la base de donnees : sinon : -1
Global ListT
If DataBaseID
If ListT=0 : ListT=1 : NewList ListTable.s() : Else : ClearList(ListTable()) : EndIf
#DB1=1
#SQL_SUCCESS                        =   0
#SQL_SUCCESS_WITH_INFO              =   1
Handle=PeekL(IsDatabase(DataBaseID)+4)

res=SQLTables_(Handle,0,0,0,0,0,0,0,0)
res&$FFFF
If res = #SQL_SUCCESS Or res = #SQL_SUCCESS_WITH_INFO
    strlen=128+1
    string1$=Space(strlen-1):strlen1.l=0
    string2$=Space(strlen-1):strlen2.l=0
    string3$=Space(strlen-1):strlen3.l=0
    string4$=Space(strlen-1):strlen4.l=0
    string5$=Space(strlen-1):strlen5.l=0
   
    SQLBindCol_(Handle,1,1,@string1$,strlen,@strlen1)
    SQLBindCol_(Handle,2,1,@string2$,strlen,@strlen2)
    SQLBindCol_(Handle,3,1,@string3$,strlen,@strlen3)
    SQLBindCol_(Handle,4,1,@string4$,strlen,@strlen4) ;#SQL_C_CHAR=1

    While SQLFetch_(Handle)&$FFFF=0
    AddElement(ListTable())
      ListTable()=string1$+"|"+string2$+"|"+string3$+" |"+string4$
    Wend
    ProcedureReturn CountList(ListTable())
EndIf 
EndIf
ProcedureReturn  -1
EndProcedure

Procedure DB_ListTableSelect(Number) ; Retourne le nom de la nième table (Base de donnees|propriétaire|Nom de la table)
SelectElement(ListTable(),Number)
ProcedureReturn ListTable()
EndProcedure

Procedure.s DB_SQL() ; Liste la dernière commande SQL exécuté
    ProcedureReturn SQL
EndProcedure

; Debug DB_Connect("bdsseguin","root","")
; n=DB_ListTable("laser","sa","")
; For a=0 To n-1
; Debug DB_ListTableSelect(a)
; Next
; Debug DB_CountRow("t_fiche")
; Debug DB_CountColumn("t_fiche")
; Debug DB_CreateTable("test","col1.int(3);Col2.char(8)")
; Debug DB_DeleteTable("test")
; Debug DB_InsertRow("t_fiche","0;3;1;121")
; Debug DB_UpdateRow("t_fiche",1,"122",2,"1000")
; Debug DB_SQL()
; Debug DatabaseError()
; Debug DB_List("t_fiche",1,0)
; Debug DB_GetValue(1,2)
; Debug DB_Sort("t_fiche",1,1)

Publié : jeu. 27/oct./2005 11:41
par Droopy
Merci

Publié : jeu. 27/oct./2005 11:46
par Chris
Mais pourquoi dans "Débutants"?

"Trucs et Astuces" ça aurait été plus logique, il me semble.

Pour ton code, je n'ai rien à dire, vu que les bases de données et moi, on est un peu en froid, ces temps-ci :lol:

Publié : jeu. 27/oct./2005 11:54
par Gillou
Ben euh, c'est que je m'adresse aux personnes qui en ont le plus besoin

Je sais que lorsque je débutais, je passais ma vie à regarder les codes de mon niveau, dans débutant

Mais, la prochaine fois, pas de pb, je poste dans "Trucs et astuces"

:)

Publié : jeu. 27/oct./2005 12:01
par Chris
Ah, mais tu fais comme tu veux, je ne dis pas "Il faut mettre ça dans...". :)

Mais il y a plus de posts dans "Débutants" que dans "Trucs et Astuces", et donc, ton post disparaîtra beaucoup plus vite si il est dans "Débutants".
C'est tout ce que je dis :lol: