Debut de package pour accès base de données

Résolu
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020
-
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020
-
Salut

voila je commence a faire un package pour l'accés à la base de données ...qu'en pensez vous ?
c juste un debut
je pense ensuite faire les ajout par SQL...

--------------------------------------------------------------------------------------------------------------------------------------
namespace Create_BD
{
    class DB_Type
    {
        static public String getBool() { return "BIT"; }
        static public String getShort() { return "SHORT"; }
    }

    class DB_Champ
    {
        private String Nom;
        private String Type;
        private int Size = 0;

        private bool Not_Null = false;
        private bool Unique = false;
        private bool Primary_Key = false;

        public DB_Champ(String theNom, String theType)
        {
            this.Nom = theNom;
            this.Type = theType;
        }

        public DB_Champ(String theNom, String theType, int theSize) : this(theNom, theType)
        {
            this.Size = theSize;
        }

        public DB_Champ(String theNom, String theType, int theSize, bool theNotNull)
            : this(theNom, theType, theSize)
        {
            this.Not_Null = theNotNull;
        }

        public DB_Champ(String theNom, String theType, int theSize, bool theNotNull,
            bool theUnique) : this(theNom, theType, theSize, theNotNull)
        {
            this.Unique = theUnique;
        }

        public DB_Champ(String theNom, String theType, int theSize, bool theNotNull,
            bool theUnique, bool thePrimary_Key) : this(theNom, theType, theSize, theNotNull, theUnique)
        {
            this.Primary_Key = thePrimary_Key;
        }

        public void Clear()
        {
            this.Nom = "";
            this.Type = "";
            this.Size = 0;
            this.Not_Null = false;
            this.Unique = false;
            this.Primary_Key = false;
        }

        public void setNom(String theNom) {this.Nom = theNom;}
        public void setType(String theType) {this.Type = theType;}
        public void setSize(int theSize) {this.Size = theSize;}
        public void setNotNull(bool theNotNull) {this.Not_Null = theNotNull;}
        public void setUnique(bool theUnique) {this.Unique = theUnique;}
        public void setPrimaryKey(bool thePrimaryKey) {this.Primary_Key = thePrimaryKey;}

        public String getNom() { return this.Nom; }
        public String getType() { return this.Type; }
        public int getSize() { return this.Size; }
        public bool getNotNull() { return this.Not_Null; }
        public bool getUnique() { return this.Unique; }
        public bool getPrimaryKey() { return this.Primary_Key; }

        public void toConsole()
        {
            Console.WriteLine("  -> " + this.Nom + "  " + this.Type + "  " + this.Size +
                "  NotNull:" + this.Not_Null + " Unique:" + this.Unique +
                " PrimaryKey:" + this.Primary_Key);
        }
    }

    class DB_Table
    {
        private String Nom;
        private ArrayList ListeChamp;

        public DB_Table()
        {
            this.ListeChamp = new ArrayList();
        }

        public void setNom(String theNom) {this.Nom = theNom;}
        public String getNom() {return this.Nom;}

        public bool Add(DB_Champ theChamp)
        {
            for (int i = 0; i < this.ListeChamp.Count; i++)
            {
                if (((DB_Champ)this.ListeChamp[i]).getNom() == theChamp.getNom())
                    return false;
            }

            ListeChamp.Add(theChamp);
            return true;
        }

        public void toConsole()
        {
            Console.WriteLine("------------------------------------------------------------------");
            Console.WriteLine(this.Nom);
            for (int i = 0; i < this.ListeChamp.Count; i++)
            {
                ((DB_Champ)this.ListeChamp[i]).toConsole();
            }
            Console.WriteLine("------------------------------------------------------------------");
        }
    }

    class Create_DB
    {       
        private String DBPath;
        private ArrayList ListTable;
       
        public String getDBPath()
        {
            return this.DBPath;
        }

        public void setDBPath(String theDBPath)
        {
            this.DBPath = theDBPath;
           
        }

        public void AddTable(DB_Table theTable)
        {
            this.ListTable.Add(theTable);
        }

        public Create_DB() {
            this.DBPath = "";
            this.ListTable = new ArrayList();
        }
    }
}
--------------------------------------------------------------------------------------------------------------------------------------

Herve

34 réponses

Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Existe t il des balises specifiques pour les commentaires en c# ? comme pour javadoc ...

Herve
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Personne pour me donner un avis ??

Herve
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Est ce correcte :

            try
            {
                if (ListeChamp.Contains(theChamp))
                    throw new Exception("Champ déja présent dans la table");
                ListeChamp.Add(theChamp);
            }
            catch (Exception aExcep)
            {
                MessageBox.Show(aExcep.Message);
            }

Herve
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Voici une nouvelle version de ma classe

using System;
using System.Collections;
using System.Text;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Data.OleDb;
using System.Data;
using ADOX;
using Fonctions_Time;

namespace DB_Access
{
internal class DB_Exception : Exception
{
public DB_Exception(String Msg)
: base(Msg)
{
MessageBox.Show("Erreur : " + Msg);
}
}

internal class DB_ObjType
{
private ADOX.DataTypeEnum DataType;
private int DefaultSize;
private bool Auto;

public DB_ObjType(ADOX.DataTypeEnum theDataType, int theDefaultSize, bool theAuto)
{
this.DataType = theDataType;
this.DefaultSize = theDefaultSize;
this.Auto = theAuto;
}

public ADOX.DataTypeEnum Type
{
get { return this.DataType; }
}

public int Size
{
get { return this.DefaultSize; }
set { this.DefaultSize = value; }
}

public bool Autoincrement
{
get { return this.Auto; }
}
}

class DB_Type
{
static public DB_ObjType Binary() { return new DB_ObjType(ADOX.DataTypeEnum.adBinary, 64, false); }
static public DB_ObjType Boolean() { return new DB_ObjType(ADOX.DataTypeEnum.adBoolean, 4, false); }
static public DB_ObjType Currency() { return new DB_ObjType(ADOX.DataTypeEnum.adCurrency, 4, false); }
static public DB_ObjType Date() { return new DB_ObjType(ADOX.DataTypeEnum.adDate, 4, false); }
static public DB_ObjType Double() { return new DB_ObjType(ADOX.DataTypeEnum.adDouble, 8, false); }
static public DB_ObjType Guid() { return new DB_ObjType(ADOX.DataTypeEnum.adGUID, 4, false); }
static public DB_ObjType Long() { return new DB_ObjType(ADOX.DataTypeEnum.adInteger, 4, false); }
static public DB_ObjType LongVarBinary() { return new DB_ObjType(ADOX.DataTypeEnum.adLongVarBinary, 4, false); }
static public DB_ObjType Memo() { return new DB_ObjType(ADOX.DataTypeEnum.adLongVarWChar, 4, false); }
static public DB_ObjType Real() { return new DB_ObjType(ADOX.DataTypeEnum.adSingle, 2, false); }
static public DB_ObjType Integer() { return new DB_ObjType(ADOX.DataTypeEnum.adSmallInt, 2, false); }
static public DB_ObjType Octet() { return new DB_ObjType(ADOX.DataTypeEnum.adUnsignedTinyInt, 2, false); }
static public DB_ObjType VarBinary() { return new DB_ObjType(ADOX.DataTypeEnum.adVarBinary, 255, false); }
static public DB_ObjType VarChar() { return new DB_ObjType(ADOX.DataTypeEnum.adVarWChar, 255, false); }
static public DB_ObjType AutoInt() { return new DB_ObjType(ADOX.DataTypeEnum.adInteger, 4, true); }
}

class DB_Champ
{
private String nom;
private DB_ObjType type;
private bool nullable;

public DB_Champ(String theNom, DB_ObjType theType)
{
this.nom = theNom;
this.type = theType;
this.nullable = false;
}

public DB_Champ(String theNom, DB_ObjType theType, bool theNull)
{
this.nom = theNom;
this.type = theType;
this.nullable = theNull;
}

public void Clear()
{
this.nom = "";
this.type = null;
this.nullable = false;
}

public String Nom
{
get { return this.nom; }
set { this.nom = value; }
}
public DB_ObjType Type
{
get { return this.type; }
set { this.type = value; }
}

public bool Nullable
{
get { return this.nullable; }
set { this.nullable = value; }
}

public override string ToString()
{
return this.nom;
}

public override int GetHashCode()
{
return this.nom.ToLowerInvariant().GetHashCode();
}

public override bool Equals(object obj)
{
DB_Champ t = obj as DB_Champ;
return t.Nom == this.nom;
}

public void toConsole()
{
Console.WriteLine(" -> " + this.nom + "\t\t\tType:" + this.type.Type + "\tSize:" + this.type.Size);
}
}

class DB_Table
{
private String nom;
private List<DB_Champ> ListeChamp;
private List<DB_Champ> ListeKey;

public DB_Table(String theNom)
{
this.ListeChamp = new List<DB_Champ>();
this.ListeKey = new List<DB_Champ>();
this.nom = theNom;
}

public String Nom
{
get { return this.nom; }
set { this.nom = value; }
}

public List<DB_Champ> Champs
{
get { return this.ListeChamp; }
}

public List<DB_Champ> Keys
{
get { return this.ListeKey; }
}

public void Add(DB_Champ theChamp)
{
try
{
if (ListeChamp.Contains(theChamp))
throw new DB_Exception("Champ déjà présent dans la table");
ListeChamp.Add(theChamp);
}
catch{}
}

public void AddKey(DB_Champ theChamp)
{
try
{
if (ListeKey.Contains(theChamp))
throw new DB_Exception("Champ déjà présent dans la table");
ListeKey.Add(theChamp);
}
catch {}
}

public void toConsole()
{
Console.WriteLine("--------------------------------------------------------------------------------------------------------");
Console.WriteLine("Table : " + this.nom);
Console.WriteLine(" - CHAMPS -");
for (int i = 0; i < this.ListeChamp.Count; i++)
this.ListeChamp[i].toConsole();
Console.WriteLine(" -> Nb champs :" + this.ListeChamp.Count);
Console.WriteLine(" - KEYS -");
for (int i = 0; i < this.ListeKey.Count; i++)
this.ListeKey[i].toConsole();
Console.WriteLine(" -> Nb keys :" + this.ListeKey.Count);
Console.WriteLine("--------------------------------------------------------------------------------------------------------");
}
}

class Create_DB : DB_ComDB
{
private String DBpath;
private List<DB_Table> ListTable;

public String DBPath
{
set { this.DBpath = value; }
get { return this.DBpath; }
}

public void AddTable(DB_Table theTable)
{
this.ListTable.Add(theTable);
}

public Create_DB(String thePath)
: base()
{
this.DBPath = thePath;
this.ListTable = new List<DB_Table>();
}

public void toConsole()
{
for (int i = 0; i < this.ListTable.Count; i++)
this.ListTable[i].toConsole();
}

public bool Create()
{
try
{
string strConn = "Provider=Microsoft.JET.OLEDB.4.0; Data Source = " + this.DBPath;

// Creation de l'instance Catalog
Catalog dbCatalog = new Catalog();
dbCatalog.Create(strConn);

Table dtTable;

for (int i = 0 ; i < this.ListTable.Count ; i++)
{
dtTable = new Table();
dtTable.Name = this.ListTable[i].Nom;
List<DB_Champ> ListeChamps = this.ListTable[i].Champs;
List<DB_Champ> ListeKeys = this.ListTable[i].Keys;

if (ListeKeys.Count == 0)
throw new DB_Exception("Aucune clé dans la table : " + this.ListTable[i].Nom);

dtTable.ParentCatalog = dbCatalog;

// Ajout des Clés dans la table
for (int j = 0 ; j < ListeKeys.Count ; j++)
{
dtTable.Columns.Append(ListeKeys[j].Nom, ListeKeys[j].Type.Type, ListeKeys[j].Type.Size);
if (ListeKeys[j].Type.Autoincrement)
{
dtTable.Columns[ListeKeys[j].Nom].Properties["AutoIncrement"].Value = true;
dtTable.Columns[ListeKeys[j].Nom].Properties["Nullable"].Value = false;
}
}
// Ajout des champs dans la table
for (int j = 0 ; j < ListeChamps.Count ; j++)
{
dtTable.Columns.Append(ListeChamps[j].Nom, ListeChamps[j].Type.Type, ListeChamps[j].Type.Size);
if (ListeChamps[j].Type.Autoincrement)
{
dtTable.Columns[ListeChamps[j].Nom].Properties["AutoIncrement"].Value = true;
dtTable.Columns[ListeChamps[j].Nom].Properties["Nullable"].Value = false;
}
else
if (ListeChamps[j].Nullable)
dtTable.Columns[ListeChamps[j].Nom].Properties["Nullable"].Value = ListeChamps[j].Nullable;
}

dbCatalog.Tables.Append((object)dtTable);

// Enregistrement des clés comme index
Index primKeyIdx = new Index();
primKeyIdx.Name = this.ListTable[i].Nom;
primKeyIdx.Unique = true;
primKeyIdx.PrimaryKey = true;
for (int j = 0 ; j < ListeKeys.Count ; j++)
{
primKeyIdx.Columns.Append(ListeKeys[j].Nom, ListeKeys[j].Type.Type, ListeKeys[j].Type.Size);
}

// Ajout de l'index dans la table
dtTable.Indexes.Append((object)primKeyIdx, null);
}

return true;
}catch(Exception aException)
{
MessageBox.Show("Create : \n" + aException.Message + "\n\nSource: " + aException.Source + "\n\nStack :" + aException.StackTrace);
return false;
}
}
}

class DB_ConnectDB
{
private OleDbConnection DbConnec;
private static DB_ConnectDB _theUniqueInstance = null;

public OleDbConnection DBConnection
{
get { return this.DbConnec; }
}

public static DB_ConnectDB GetInstance()
{
//creer une nouvelle instance s il n en existe pas deja une autre
if (_theUniqueInstance == null)
return _theUniqueInstance = new DB_ConnectDB();
else
return _theUniqueInstance;
}

public DB_ConnectDB()
{ String chaineCnx "provider microsoft.jet.oledb.4.0 ; data source = " + ConfigApp.Config.DbPath;
DbConnec = new OleDbConnection(chaineCnx);

this.Open();
}

public void Open()
{
if (DbConnec.State == System.Data.ConnectionState.Closed)
DbConnec.Open();
}

public void Close()
{
if (DbConnec.State == System.Data.ConnectionState.Open)
DbConnec.Close();
}
}

class DB_ComDB
{
public static String DateTime2SQLDate(DateTime theDate)
{
return theDate.Year + "-" + theDate.Month + "-" + theDate.Day
+ " " + theDate.Hour + ":" + theDate.Minute + ":" + theDate.Second;
}

private bool executeQuery(String theReq)
{
try
{
OleDbCommand cmd = new OleDbCommand(theReq, DB_ConnectDB.GetInstance().DBConnection);
cmd.ExecuteNonQuery();
return true;
}
catch (Exception e)
{
MessageBox.Show(e.Message + "\n" + theReq);
return false;
}
}

private DataSet getDataset(String theReq, String theTable)
{
try
{
OleDbDataAdapter da = new OleDbDataAdapter(theReq, DB_ConnectDB.GetInstance().DBConnection);
DataSet ds = new DataSet();
da.Fill(ds, theTable);
return ds;
}
catch (Exception e)
{
MessageBox.Show(e.Message + "\n" + theReq);
return null;
}
}

public bool Insert(String theTable, String[] theChamps, String[] theValues)
{ String Req "", Champs "", Val = "";

for (int i = 0; i < theChamps.Length; i++)
Champs += (theChamps[i].ToString() + ",");

// on enlève la virgule de fin de chaîne
Champs = Champs.Substring(0, Champs.Length - 1);

for (int i = 0; i < theValues.Length; i++)
Val += (theValues[i].ToString() + ",");

// on enlève la virgule de fin de chaîne
Val = Val.Substring(0, Val.Length - 1);

Req = "INSERT INTO " + theTable + "(" + Champs + ") VALUES (" + Val + ")";

return this.executeQuery(Req);
}

public bool Insert(String theTable, String []theValues)
{ String Req "", Val "";

for (int i = 0; i < theValues.Length; i++)
Val += theValues[i].ToString() + ",";

// on enlève la virgule de fin de chaîne
Val = Val.Substring(0, Val.Length - 1);

Req = "INSERT INTO " + theTable + " VALUES (" + Val + ")";

return this.executeQuery(Req);
}

public bool Update(String theTable, String[] theValues, String theWhere)
{ String Req "", Val "";

for (int i = 0; i < theValues.Length; i++)
Val += (theValues[i].ToString() + ",");

// on enlève la virgule de fin de chaîne
Val = Val.Substring(0, Val.Length - 1);

Req = "UPDATE " + theTable + " SET " + Val + " WHERE " + theWhere;

return this.executeQuery(Req);
}

public bool Delete(String theFrom, String theWhere)
{
String Req = "DELETE FROM " + theFrom + " WHERE " + theWhere;
return this.executeQuery(Req);
}

public DataSet Select(String theSel, String theFrom, String theWhere)
{
String Req = "SELECT " + theSel + " FROM " + theFrom + " WHERE " + theWhere;
return getDataset(Req, theFrom);
}

public DataSet Select(String theFrom, String theWhere)
{
String Req = "SELECT * FROM " + theFrom + " WHERE " + theWhere;
return getDataset(Req, theFrom);
}
}
}

Merci pour les avis ....

Herve
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Apparement cela inspire beaucoup de monde ...

J'aimerais securise mon code pour eviter le SQL injection .... Comment faire ?
Merci d'avance

Herve
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
30 octobre 2008
55
C'est pas que ca nous inspire pas, c'est surtout qu'on a pas forcément le temps de tout analyser ;)
Pour eviter les injections SQL, utilises des requetes paramétrées plutot que des chaines concaténées pour tes requetes.

N'hésite pas a poster une source avec ton code, que tu feras évoluer, plutot que de tout poster en bloc sur le forum ;)

Mx
MVP C# 
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Ok

question bete : comment on fait ?
Sinon, par exemple, pour ma fonction
public bool Update(String theTable, String[] theValues, String theWhere)

je passe un tableau de string , ce ne serrait pas mieux d'utiliser une arraylist ?

Herve
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
30 octobre 2008
55
Non, pas un ArrayList, sachant qu'un ArrayList stocke des object.
Ca voudrait dire boxing (tu vas passer d'un string a un object quand tu vas ajouter tes strings a ta collection) puis unboxing (tu vas repasser d'un object a un string qaund tu vas vouloir recuperer tes valeurs) -> Donc baisse de perfs.
A la limite, tu peux utiliser un List<string> plutot, là tu n'auras plus ce probleme de boxing / unboxing. (de facon générale, en .Net 2, on utilise des collections génériques)

D'ailleurs, quand tu recuperes les elements de ton tableau, tu n'as pas besoin d'appeler ToString(), sachant que tu recuperes deja des strings

Mx
MVP C# 
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Collection generique = List<String> ???

Herve
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
30 octobre 2008
55
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Merci !
Comment fait on pour fair des requetes parametres ?

Herve
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Salut

J'ai remarque un probleme, dans mon app je test au
demarrage l'existence de la BDD sinon je la cree.. et ensuite je fais
qq requetes ...mon prob est que lorsque je lance le prog, sans BDD, il
ZAP la premiere requete


Si je la lance en pas a pas ou que la bdd existe deja, il n'y a aucun
probleme, la premiere est bien lance et existe dans la BDD !

le plus etrange c'est que le prog passe bien dans les differentes fonctions ....


@+

Herve
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
30 octobre 2008
55
Salut

Sans bout de code, ca va etre difficile de t'indiquer le probleme.
Cependant, je t'invite a ouvrir nu nouveau sujet, ou indiquant précisément ton souci, plutot que d'utiliser ce sujet a rallonge ;) Comme ca tout le monde pourra en profiter.

Mx
MVP C# 
Messages postés
572
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
4 mai 2020

Ok merci ....
J'ai pas le code sous la main ... je vais le recuperer ....

C'est bien la premiere fois qu'un admin me dis de faire un nouveau sujet

Herve