IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

[BDD] permettre l'interrogation de plusieurs types de base de données


Sujet :

ASP.NET

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2006
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 214
    Points : 169
    Points
    169
    Par défaut [BDD] permettre l'interrogation de plusieurs types de base de données
    Bonjour,

    J'ai une question concernant un projet que je souhaiterais voir aboutir.
    Comment rendre un projet (ASP.net / C#) "compatible" avec plusieurs type de base de données?
    [Rétorique] avec une interface si je ne m'abuse.

    Vous allez me demander l'utilité d'un tel projet?
    Tous simplement faire en sorte que mon projet puisse fonctionner sur des configurations différentes dans l'état où elles sont sans modifications du code, et sans nouvelle installation. un réseau avec une base de données MSSQL, ou un réseau avec une base de données MySQL, ou encore une BDD Oracle.

    Et des bases de donnée embarquer type Mysqli ou lite (je sais plus mais vous m’aurez compris) ?
    Je ne souhaite pas les utiliser vue qu'a terme la quantité de donnée sera considérable autant sur un serveur de test ça pourrais bien rendre autant en prod je vois mal ces système géré des millions d'enregistrements.

    J'ai créé une page de configuration pour entrer les paramètres des bases (cela fonctionne)

    Maintenant passons au cœur de mon problème j'ai essayé de faire une interface et de m'en servir pour me connecter aux base de donnée sauf que les type étant ce qu'il sont, MySQLConnetion est différent de SQLConnection et je suppose (j'ai pas encore travailler sur de l'Oracle) de OracleConnection...

    Donc voilà ma question :
    Comment faire un connecteur unique pour différents type de base de données?

    J'espère que je ne vous aurais pas perdu en cours de route
    et merci d'avance

    PS : j'ai fait une petite recherche avant, mais je n'es rien trouver de véritablement pertinent si vous êtes plus chanceux n'ésitez pas à me donner un lien avec la solution à mon problème
    règle numéro 12 : toujours s'offrir une entrée charismatique !

  2. #2
    Membre expérimenté Avatar de bossun
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 359
    Points : 1 443
    Points
    1 443
    Par défaut
    Salut,

    Voilà ton bonheur,

    J'ai fait ce travail y a quelques années

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
        using System;
        using System.Collections.Generic;
        using System.Text;
        using System.Configuration;
        using System.Data.Common;
        using System.Data;
        namespace CrmDbClient
        {
        public class CrmDbClientException:Exception
        {
        public CrmDbClientException(string Message):base(Message){}
        public CrmDbClientException(string Message, Exception inerException) : base(Message, inerException) { }
        }
        public class CrmDbClient : IDisposable
        {
        private IDbConnection _DbConnection;
        private IDbCommand _DbCommand;
        private ConnectionStringSettings _DbConnectionString;
        private DbProviderFactory _DbFactory = null;
        private IDbTransaction _DbTransaction = null;
        private IDbDataAdapter _DbDataAdapter = null;
        /// <summary>
        /// Creates a new instance of CRMDbClient
        /// </summary>
        /// <param name="CurrentConnectionString"></param>
        public CrmDbClient(ConnectionStringSettings CurrentConnectionString)
        {
        _DbConnectionString = CurrentConnectionString;
        _DbFactory = DbProviderFactories.GetFactory(CurrentConnectionString.ProviderName);
        _DbConnection = _DbFactory.CreateConnection();
        _DbConnection.ConnectionString = CurrentConnectionString.ConnectionString;
        _DbCommand = _DbConnection.CreateCommand();
        _DbDataAdapter = _DbFactory.CreateDataAdapter();
        _DbDataAdapter.SelectCommand = _DbCommand;
        OpenConnection();
        }
        /// <summary>
        /// Destroy the current instance
        /// </summary>
        public void Dispose()
        {
        CloseConnection();
        _DbCommand.Dispose();
        _DbConnection.Dispose();
        _DbConnectionString = null;
        _DbDataAdapter = null;
        _DbFactory = null;
        _DbTransaction = null;
        }
        ~CrmDbClient()
        {
        GC.Collect();
        }
        #region Properties
        /// <summary>
        /// Gets or sets the command timeout in seconds
        /// </summary>
        public int CommandTimeout
        {
        get { return _DbCommand.CommandTimeout; }
        set { _DbCommand.CommandTimeout = value; }
        }
        /// <summary>
        /// Gets the database provider
        /// </summary>
        public string DataBaseProvider
        {
        get{return _DbConnectionString.ProviderName;}
        }
        /// <summary>
        /// Gets or set the
        /// </summary>
        public int ConnectionTimeout
        {
        get { return _DbConnection.ConnectionTimeout; }
        }
        #endregion
        /// <summary>
        /// Begins transaction
        /// </summary>
        public void BeginTransaction()
        {
        _DbCommand.Transaction = _DbTransaction = _DbConnection.BeginTransaction();
        }
        /// <summary>
        /// Commit transaction
        /// </summary>
        public void CommitTransaction()
        {
        if (_DbTransaction != null)
        {
        _DbTransaction.Commit();
        _DbTransaction.Dispose();
        _DbTransaction = null;
        _DbCommand.Transaction = null;
        }
        else
        {
        throw new CrmDbClientException("BeginTransaction must be called before commit or rollback. No open transactions found");
        }
        }
        /// <summary>
        /// Rollbacks transaction
        /// </summary>
        public void RollbackTransaction()
        {
        try
        {
        _DbTransaction.Rollback();
        }
        catch (InvalidOperationException invexcept)
        {
        throw new CrmDbClientException(invexcept.Message, invexcept);
        }
        catch (Exception e)
        {
        throw new CrmDbClientException(e.Message, e);
        }
        finally
        {
        //dispose _dbTransaction
        if (_DbTransaction != null)
        _DbTransaction.Dispose();
        _DbTransaction = null;
        }
        }
        /// <summary>
        /// Creates a generic parameter
        /// </summary>
        /// <param name="ParameterName">Represents the prameter's name</param>
        /// <param name="ParameterValue">Represents the parameter's value</param>
        /// <returns>IDbDataParameter</returns>
        private IDbDataParameter CreateParameter(string ParameterName,object ParameterValue)
        {
        IDbDataParameter p = _DbCommand.CreateParameter(); //create the command using the DBCommand
        p.Value = ParameterValue;
        p.ParameterName = ParameterName ;
        return p;
        }
        /// <summary>
        /// Open the connection with de server
        /// </summary>
        private void OpenConnection()
        {
        if (_DbConnection.State != ConnectionState.Open)
        _DbConnection.Open();
        }
        /// <summary>
        /// Closes the connection with the server
        /// </summary>
        private void CloseConnection()
        {
        if (_DbConnection.State != ConnectionState.Closed)
        _DbConnection.Close();
        }
        /// <summary>
        /// Executes a scalar query
        /// </summary>
        /// <param name="sql">Represents the query text</param>
        /// <param name="CmdType">Represents the command type</param>
        /// <returns>Object</returns>
        public object ExecuteScalarQuery(string QueryText,CommandType CmdType)
        {
        _DbCommand.CommandText = QueryText; //set que querytext
        _DbCommand.CommandType = CmdType;
        OpenConnection();
        object val = _DbCommand.ExecuteScalar(); //runs que query
        _DbCommand.Parameters.Clear();
        //CloseConnection();
        return val;
        }
        /// <summary>
        /// Executes a parametred scalar query
        /// </summary>
        /// <param name="QueryText">Query text</param>
        /// <param name="Parameters">Parameters list</param>
        /// <param name="CmdType">Command type</param>
        /// <returns></returns>
        public object ExecuteScalarQuery(string QueryText, Dictionary<string, object> Parameters, CommandType CmdType)
        {
        _DbCommand.CommandText = QueryText;
        _DbCommand.CommandType = CommandType.Text;
        _DbCommand.Parameters.Clear(); //clear parameters
        foreach (KeyValuePair<string, object> k in Parameters)
        {
        _DbCommand.Parameters.Add(CreateParameter(k.Key, k.Value));
        }
        OpenConnection();
        object val = _DbCommand.ExecuteScalar();
        _DbCommand.Parameters.Clear(); //clear parameters
        return val;
        }
        /// <summary>
        /// Executes a query and retourns the result into a datatable.
        /// </summary>
        /// <param name="QueryText">Query text</param>
        /// <param name="CmdType">Command type</param>
        /// <returns>Datatable containing the result</returns>
        public DataTable ExecuteReaderQuery(string QueryText, CommandType CmdType)
        {
        DataSet myDs = new DataSet();
        _DbCommand.CommandText = QueryText;
        _DbCommand.CommandType = CmdType;
        OpenConnection();
        _DbDataAdapter.Fill(myDs);
        return myDs.Tables[0];
        }
        /// <summary>
        /// Executes a parametred query and retourns the result into a datatable
        /// </summary>
        /// <param name="QueryText">Query text</param>
        /// <param name="QueryParameters">Command type</param>
        /// <param name="CmdType">Parameters list</param>
        /// <returns></returns>
        public DataTable ExecuteReaderQuery(string QueryText, Dictionary<string, object> QueryParameters, CommandType CmdType)
        {
        _DbDataAdapter.SelectCommand.Parameters.Clear();
        foreach (KeyValuePair<string, object> k in QueryParameters)
        {
        _DbDataAdapter.SelectCommand.Parameters.Add(CreateParameter(k.Key, k.Value));
        }
        DataTable val = this.ExecuteReaderQuery(QueryText,CmdType);
        _DbCommand.Parameters.Clear(); //clear parameters
        return val;
        }
        /// <summary>
        /// Executes a query and retourns affected rows number
        /// </summary>
        /// <param name="QueryText">Query text</param>
        /// <param name="CmdType">Command Type</param>
        /// <returns></returns>
        public int ExecuteNonQuery(string QueryText, CommandType CmdType)
        {
        _DbCommand.CommandText = QueryText;
        _DbCommand.CommandType = CmdType;
        OpenConnection();
        return _DbCommand.ExecuteNonQuery();
        }
        /// <summary>
        /// Executes a parametred query and retourns affected rows number
        /// </summary>
        /// <param name="QueryText">Query text</param>
        /// <param name="QueryParameters">Query parameters</param>
        /// <param name="CmdType">Command type</param>
        /// <returns>Integer value representing affected rows</returns>
        public int ExecuteNonQuery(string QueryText, Dictionary<string, object> QueryParameters, CommandType CmdType)
        {
        _DbCommand.Parameters.Clear();
        foreach (KeyValuePair<string, object> k in QueryParameters)
        {
        _DbCommand.Parameters.Add(this.CreateParameter(k.Key, k.Value));
        }
        int val = this.ExecuteNonQuery(QueryText, CmdType);
        _DbCommand.Parameters.Clear();
        return val;
        }
        }
        }
    Bonne journée
    il vaut mieux prendre son pied que de se prendre la tête!!

    http://bossun.noxblog.com

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2006
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 214
    Points : 169
    Points
    169
    Par défaut
    Ce que tu me propose m'a l'air fort prometteur je te remercie. (je laisse en non résolut le temps de faire les tests)

    Une petite question l'utilisation du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /// <summary> </summary>
    (je ne la connaissais pas) c'est pour avoir une explication détaillée de la fonction lorsque tu l'utilises dans ton code, c'est bien ça?
    règle numéro 12 : toujours s'offrir une entrée charismatique !

  4. #4
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Hello,

    Sinon, il y a aussi ce tuto qui montre comment utiliser plusieurs DAL: http://immobilis.developpez.com/tuto...mework/#LIII-C

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2006
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 214
    Points : 169
    Points
    169
    Par défaut
    j'ai juste un petit problème avec vos 2 solutions c'est qu'elles utilise le fichier de configuration.
    personnellement je fais comme si je ne savais pas ce qu'il y a derrière le site. ça peux être n'importe qu'elle base de donnée j'ai donc un formulaire qui me permet de stocker dans un fichier binaire les informations sur la base de données.

    Lorsque je m'apprète à faire une requète, je récupère ces informations et j'ouvre ma BDD comme cela exemple avec MySQL:
    (Pour avancer sur le développement c'est la base que j'ai choisi, maintenant je souhaite faire évoluer le projet de manière à ce qu'il accepte plusieurs type de BDD)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    public MySqlConnection connect(string lIPServeur, string laBase, string leUser, string lePassword)
            {
                String sqlStr;
                sqlStr = MakeConnectionString(lIPServeur, laBase, leUser, lePassword);
                this.mysql = new MySqlConnection(sqlStr);
                try
                {
                    this.mysql.Open();
                    this.server = lIPServeur;
                    this.password = lePassword;
                    this.user = leUser;
                    this.database = laBase;
                    _isConnected = true;
                }
                catch (MySql.Data.MySqlClient.MySqlException e)
                {
                    System.Diagnostics.Debug.WriteLine("Exception : " + e);
                    _isConnected = false;
                }
                return this.mysql;
            }
    ma fonction MakeConnectionString :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    private string MakeConnectionString(string lIPServeur, string laBase, string leUser, string lePassword)
            {
                String cxStr;
     
                cxStr = "SERVER=" + lIPServeur + ";DATABASE=" + laBase + ";User id=" + leUser + ";PWD=" + lePassword + ";";
     
                return cxStr;
            }
    donc si je ne me trompe pas, je n'écrit rien dans le fichier de webconfig...
    Je rappel que dans mon cas, le serveur de BDD n'est pas connue, je souhaite pouvoir déployer l'application aussi bien chez moi que chez mes parents ou chez des amis et qu'il peuvent utiliser n'importe qu'elle type de SGBD

    Donc sauf s'il existe une méthode pour écrire de manière dynamique dans le fichier webconf (chose je ne sais pas mais je vais chercher ça tout suite après avoir poster ce message^^) vos solutions ne paraisse plus convenir après avoir lut et essayer de comprendre le code ^^

    toute fois si vous avez d'autre idée ou des piste sur l'écriture dans le webconf je suis preneur^^
    règle numéro 12 : toujours s'offrir une entrée charismatique !

  6. #6
    Membre expérimenté Avatar de bossun
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 359
    Points : 1 443
    Points
    1 443
    Par défaut
    Bon, si tu ne connais pas la base de données, tu as 2 problèmes.

    1.- tu dois écrie du sql pour tous les types de base de de données en respectant les particularité de chaque système
    2.- une chaine de connexion pour sqlserver est différente d'une chaine pour mysql. Donc tu dois faire un test avec toutes les variantes de chaines de connexion pour voir quelle base est la bonne.
    il vaut mieux prendre son pied que de se prendre la tête!!

    http://bossun.noxblog.com

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2006
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 214
    Points : 169
    Points
    169
    Par défaut
    Citation Envoyé par bossun Voir le message

    1.- tu dois écrie du sql pour tous les types de base de de données en respectant les particularité de chaque système
    Cela ne m'effrais pas, c'est déjà fait pour MSSQL et MYSQL il n'y a que "My" qui change entre les 2 je code mes requêtes de manière propre au langage SQL de base et me sert pas de spécificité particulière je n'en ai généralement pas l'utilité
    exemple MySqlCommand au lieu de SqlCommand... (au incertitude de majuscule près, merci intelisens )

    Citation Envoyé par bossun Voir le message
    2.- une chaine de connexion pour sqlserver est différente d'une chaine pour mysql. Donc tu dois faire un test avec toutes les variantes de chaines de connexion pour voir quelle base est la bonne.
    Là aussi j'en ai une qui fonctionne, ce n'est pas le problème...

    Ce que je souhaite arrivé à faire c'est suivant le paramétrage de l'utilisateur, nom du serveur / @ IP / instance / nom d'utilisateur / mot de passe, ce serais d'ajouté dans le web.config les données de création de chaîne, dans le pire des cas un switch/case peux me permettre de tester les variante de chaine pour chaque type de base et trouver celle qui corresponds à la configuration du site, avant de l'insérer dans le web.config.
    règle numéro 12 : toujours s'offrir une entrée charismatique !

  8. #8
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Citation Envoyé par ben_skywalker Voir le message
    j'ai juste un petit problème avec vos 2 solutions c'est qu'elles utilise le fichier de configuration.
    C'est juste un faux problème.

    Dans l'exemple que te donne bossun il utilise une IDbConnection. Il s'agit d'une interface implémentée par les objets qui te permettent d'accéder à une base de donnée. L'avantage c'est qu'il n'a qu'à changer la chaine de connection son code fonctionnera toujours avec la même DAL.

    Dans mon exemple, le code utilise une DAL en fonction d'un paramètre d'entrée. La base de donées sous-jacente peut être un fichier texte, excel, Access, SQL, Oracle, peu importe. Il y a une DAL par SGBDD.

    L'utilisation d'une chaîne de connection peut être géré de manière dynamique. L'emplacement de cette information peut être le fichier de configuration, un web service, etc. mais cela n'a pas d'importance et surtout aucun rapport avec la DAL. La DAL attend une chaine de connection. Peu importe la façon dont tu la lui procures. L'essentiel étant que tu ne lui donne pas une chaine MySQL pour une base de données SQL Server.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2006
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 214
    Points : 169
    Points
    169
    Par défaut
    ok j'ai mal interprété ce que je voyais alors désolé je vais plancher la dessus à tête reposée et demanderais un coup de main, si besoins.

    en tout cas merci pour les précisions
    règle numéro 12 : toujours s'offrir une entrée charismatique !

  10. #10
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Comme indiqué précédemment, on peut parfaitement créer un interface unique pour plusieurs types de bases de données : par exemple, toutes nos applications sont conçues pour fonctionner indifférement sous Oracle, MySql, SQL server ou Ms-Access. On peut même déduire le type de base en fonction des paramètres présents dans la chaîne de connexion.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  11. #11
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Je vous renvoie à un article MSDN traitant de ce sujet :
    Écrire du code indépendant du fournisseur avec ADO.NET.

    Ceci dit, je rejoins ce qu'a dit bossun : le code SQL devra être compatible avec tous les fournisseurs prévus par l'application, ce qui est loin d'être simple !
    De plus, dans la grande majorité des cas du monde réel, une application n'utilise qu'une seule base de données.

    Ce défi relève du cas d'école et est très enrichissant à implémenter, mais sans vouloir offenser, je crois que c'est d'un niveau un peu trop complexe par rapport à ton projet.
    Tu veux pouvoir "déployer" ton application chez toi, tes amis ou ta famille. Dans ce cas pourquoi ne pas utiliser plutôt une base de données embarquée avec l'application (genre SQLite) ?
    Ne serait-ce que pour l'installation du serveur de base de données... D'ailleurs : autant une base MySql s'installe assez simplement, autant une base Oracle demande de sérieuses compétences et peut être très gourmande en ressources !

  12. #12
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Le plus simple reste d'utiliser le Framework et la DbProviderFactory. Celle-ci permet déjà de gérer les principaux SGDBDD. Ex: http://dotnet.developpez.com/faq/asp...#adonet_select

    Les opérations de requêtage de BDD étant les mêmes d'un point de vu fonctionnel, si le Framewok ne suffit pas , il te suffit, d'implémenter ton propre fournisseur. En créant des objets implémentant les interfaces IDbConnection, IDbCommand, etc. tu auras ce que tu souhaites.

    Pour rappel, la question de la chaine de connection n'est pas le plus gros problème.
    "Winter is coming" (ma nouvelle page d'accueil)

  13. #13
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    Le plus simple reste d'utiliser le Framework et la DbProviderFactory. Celle-ci permet déjà de gérer les principaux SGDBDD. Ex: http://dotnet.developpez.com/faq/asp...#adonet_select
    Comme cela est préconisé dans le lien que j'ai donné plus haut.

  14. #14
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Citation Envoyé par Skalp Voir le message
    Comme cela est préconisé dans le lien que j'ai donné plus haut.
    Tout à fait
    "Winter is coming" (ma nouvelle page d'accueil)

  15. #15
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2006
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 214
    Points : 169
    Points
    169
    Par défaut
    Citation Envoyé par Skalp Voir le message
    Je vous renvoie à un article MSDN traitant de ce sujet :
    Écrire du code indépendant du fournisseur avec ADO.NET.
    Il me semble avoir déjà regarder dans cette direction, avec pour résultat un avertissement de désuétude si je ne me trompe pas, je vais regarder ce qu'il disent sur cette article merci bien

    Citation Envoyé par Skalp Voir le message
    Ceci dit, je rejoins ce qu'a dit bossun : le code SQL devra être compatible avec tous les fournisseurs prévus par l'application, ce qui est loin d'être simple !
    De plus, dans la grande majorité des cas du monde réel, une application n'utilise qu'une seule base de données.
    Bon j'avoue qu'en faite j'aurais du parler d'entreprise et je veux pouvoir implémenter mon programme sur le SGBD qu'elle utilise tout les jours
    quand au requète sql que je fait ce sont des opération CRUU (rien ne doit être supprimé, donc on update un flag pour "désactivé" le tuple

    Citation Envoyé par Skalp Voir le message
    Ce défi relève du cas d'école et est très enrichissant à implémenter, mais sans vouloir offenser, je crois que c'est d'un niveau un peu trop complexe par rapport à ton projet.
    Tu veux pouvoir "déployer" ton application chez toi, tes amis ou ta famille. Dans ce cas pourquoi ne pas utiliser plutôt une base de données embarquée avec l'application (genre SQLite) ?
    Pour stocker millions de tuples est-ce que cela tiendrait la charge? sachant qu'il y a un système d'historique pour pouvoir contrôler les différents changement sur toute la durée de vie de l'application (je reconnais que ça sera une usine à gaz cette base de données, mais pour le moment c'est ce que mes collègues et moi avons décidé de faire - et ça me donne une idée d'amélioration du coup un paramètre qui définirait le délais de rétention des informations merci )

    bref là actuellement j'ai 2 chaine de connexions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mssqlcxStr = "Data Source=MsSQL01\\myInstance;Initial Catalog=MyDB;User ID=UserApp;Password=Passwd";
     
    mysqlcxStr = "SERVER=ServerDeb01; DATABASE=MyDB; User id= UserApp; PWD= Passwd;";
    je me connecte bien à chacune de mes bases mais j'ai du mal avec l'implémentation de l'objet ConnectionStringSettings.
    Voilà ce que je fait (il s'agit d'un projet de test avant de modifier le projet en cours de dev je cherche à comprendre comment cela fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    string mydbcx = null;
    string msdbcx = null;
    if ((SuccessMydbConnect() == true) 
    {
       mysqlcxStr = "MyConnectionStringForMySQLServer";
       MySqlConnection mysql = new MySqlConnection(mysqlcxStr);
       mysql.Open();
       mysql.Close();
       mydbcx = mysqlcxStr;
    }
    if(SuccessMSdbConnect() == true))
    {
       mssqlcxStr = "MyConnectionStringForMSSQLServer";
       SqlConnection mysql = new SqlConnection(mssqlcxStr);
       mysql.Open();
       mysql.Close();
       msdbcx = mssqlcxStr;
    }
    ConnectionStringSettings css = new ConnectionStringSettings ("myCxActive", mydbcx);
    CrmDbClient cdc = new CrmDbClient(css);
    Lblerr.Text = cdc.DataBaseProvider;
    j'ai une erreur sur cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _DbFactory = DbProviderFactories.GetFactory(CurrentConnectionString.ProviderName);
    Détails de l'exception: System.ArgumentException: Chaîne non vide attendue pour le paramètre 'providerInvariantName'.

    Mais bon s'il y a plus simple avec le lien msdn je vais regarder de ce côté là ça m'a l'air plus comme ce que je voulais au départ
    règle numéro 12 : toujours s'offrir une entrée charismatique !

  16. #16
    Membre expérimenté Avatar de bossun
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 359
    Points : 1 443
    Points
    1 443
    Par défaut
    J'ai modifié un peu ma classe pour que tu puisse te débrouiller.

    1. J'ai modifié le constructeur de la classe, où tu lui passe les paramètres que tu vois.
    2. Le code de l'ancien constructeur je l'ai mis dans une fonction "CreateConnectionToDB"
    3. J'ai crée un dictionnaire<string,string> où la clé = provider et valeur = chaine de connexion. Dans le constructeur je remplis le dictionnaire en question avec le provider et la chaine de connexion des bases de données que tu veux gérer.


    Ce code fait ce que tu as besoin. Il faut que tu le factorise un peu mieux si tu le désires. Je n'ai pas testé les modifications que je viens de faire. Je te laisse le soin de le faire pour moi.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
     
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Configuration;
    using System.Data.Common;
    using System.Data;
     
    namespace CrmDbClient
    {
        public class CrmDbClientException : Exception
        {
            public CrmDbClientException(string Message) : base(Message) { }
            public CrmDbClientException(string Message, Exception inerException) : base(Message, inerException) { }
        }
        public class CrmDbClient : IDisposable
        {
            private IDbConnection _DbConnection;
            private IDbCommand _DbCommand;
            private ConnectionStringSettings _DbConnectionString;
            private DbProviderFactory _DbFactory = null;
            private IDbTransaction _DbTransaction = null;
            private IDbDataAdapter _DbDataAdapter = null;
     
            private Dictionary<string, string> cnxProvider = new Dictionary<string, string>();
     
     
     
            /// <summary>
            /// Creates a new instance of CRMDbClient
            /// </summary>
            /// <param name="CurrentConnectionString"></param>
            private bool CreateConnectionToDB (ConnectionStringSettings CurrentConnectionString)
            {
                try
                {
                    _DbConnectionString = CurrentConnectionString;
                    _DbFactory = DbProviderFactories.GetFactory(CurrentConnectionString.ProviderName);
                    _DbConnection = _DbFactory.CreateConnection();
                    _DbConnection.ConnectionString = CurrentConnectionString.ConnectionString;
                    _DbCommand = _DbConnection.CreateCommand();
                    _DbDataAdapter = _DbFactory.CreateDataAdapter();
                    _DbDataAdapter.SelectCommand = _DbCommand;
                    OpenConnection();
     
                    return true;
                }
                catch
                {
                    return false;
                }
     
     
            }
     
            public CrmDbClient(string ServerName, int Port, string DbName , string UserName, string Password)
            {
                //Ici tu ajoute la chaine de connexion que tu veux gérer avec leur providers
                cnxProvider.Add("System.Data.SqlClient", "Data Source={0};Initial Catalog={2};User ID={3};Password={4}");  //sql server
                cnxProvider.Add("Provider de MySQL", "SERVER={0}; DATABASE={2}; User id={3}; PWD={4};");// mysql
     
     
     
                // on parcourt toutes les chaines de connexion que tu as ajouté en haut
                foreach(KeyValuePair<string,string> k in cnxProvider)
                {
                    //Construction de la chaine de connexion + provider
                    ConnectionStringSettings cnx = new ConnectionStringSettings();
     
                    cnx.ProviderName = k.Key;
                    cnx.ConnectionString = string.Format(k.Value, new object[] { ServerName, Port, DbName, UserName, Password });
     
                    // Test de connexion. 
                    if (CreateConnectionToDB(cnx))
                    {
                        // Si ok, on quitte la boucle foreach
                        break;
                    }
     
                }
     
            }
     
            /// <summary>
            /// Destroy the current instance
            /// </summary>
            public void Dispose()
            {
                CloseConnection();
                _DbCommand.Dispose();
                _DbConnection.Dispose();
                _DbConnectionString = null;
                _DbDataAdapter = null;
                _DbFactory = null;
                _DbTransaction = null;
            }
            ~CrmDbClient()
            {
                GC.Collect();
            }
            #region Properties
            /// <summary>
            /// Gets or sets the command timeout in seconds
            /// </summary>
            public int CommandTimeout
            {
                get { return _DbCommand.CommandTimeout; }
                set { _DbCommand.CommandTimeout = value; }
            }
            /// <summary>
            /// Gets the database provider
            /// </summary>
            public string DataBaseProvider
            {
                get { return _DbConnectionString.ProviderName; }
            }
            /// <summary>
            /// Gets or set the
            /// </summary>
            public int ConnectionTimeout
            {
                get { return _DbConnection.ConnectionTimeout; }
            }
            #endregion
            /// <summary>
            /// Begins transaction
            /// </summary>
            public void BeginTransaction()
            {
                _DbCommand.Transaction = _DbTransaction = _DbConnection.BeginTransaction();
            }
            /// <summary>
            /// Commit transaction
            /// </summary>
            public void CommitTransaction()
            {
                if (_DbTransaction != null)
                {
                    _DbTransaction.Commit();
                    _DbTransaction.Dispose();
                    _DbTransaction = null;
                    _DbCommand.Transaction = null;
                }
                else
                {
                    throw new CrmDbClientException("BeginTransaction must be called before commit or rollback. No open transactions found");
                }
            }
            /// <summary>
            /// Rollbacks transaction
            /// </summary>
            public void RollbackTransaction()
            {
                try
                {
                    _DbTransaction.Rollback();
                }
                catch (InvalidOperationException invexcept)
                {
                    throw new CrmDbClientException(invexcept.Message, invexcept);
                }
                catch (Exception e)
                {
                    throw new CrmDbClientException(e.Message, e);
                }
                finally
                {
                    //dispose _dbTransaction
                    if (_DbTransaction != null)
                        _DbTransaction.Dispose();
                    _DbTransaction = null;
                }
            }
            /// <summary>
            /// Creates a generic parameter
            /// </summary>
            /// <param name="ParameterName">Represents the prameter's name</param>
            /// <param name="ParameterValue">Represents the parameter's value</param>
            /// <returns>IDbDataParameter</returns>
            private IDbDataParameter CreateParameter(string ParameterName, object ParameterValue)
            {
                IDbDataParameter p = _DbCommand.CreateParameter(); //create the command using the DBCommand
                p.Value = ParameterValue;
                p.ParameterName = ParameterName;
                return p;
            }
            /// <summary>
            /// Open the connection with de server
            /// </summary>
            private void OpenConnection()
            {
                if (_DbConnection.State != ConnectionState.Open)
                    _DbConnection.Open();
            }
            /// <summary>
            /// Closes the connection with the server
            /// </summary>
            private void CloseConnection()
            {
                if (_DbConnection.State != ConnectionState.Closed)
                    _DbConnection.Close();
            }
            /// <summary>
            /// Executes a scalar query
            /// </summary>
            /// <param name="sql">Represents the query text</param>
            /// <param name="CmdType">Represents the command type</param>
            /// <returns>Object</returns>
            public object ExecuteScalarQuery(string QueryText, CommandType CmdType)
            {
                _DbCommand.CommandText = QueryText; //set que querytext
                _DbCommand.CommandType = CmdType;
                OpenConnection();
                object val = _DbCommand.ExecuteScalar(); //runs que query
                _DbCommand.Parameters.Clear();
                //CloseConnection();
                return val;
            }
            /// <summary>
            /// Executes a parametred scalar query
            /// </summary>
            /// <param name="QueryText">Query text</param>
            /// <param name="Parameters">Parameters list</param>
            /// <param name="CmdType">Command type</param>
            /// <returns></returns>
            public object ExecuteScalarQuery(string QueryText, Dictionary<string, object> Parameters, CommandType CmdType)
            {
                _DbCommand.CommandText = QueryText;
                _DbCommand.CommandType = CommandType.Text;
                _DbCommand.Parameters.Clear(); //clear parameters
                foreach (KeyValuePair<string, object> k in Parameters)
                {
                    _DbCommand.Parameters.Add(CreateParameter(k.Key, k.Value));
                }
                OpenConnection();
                object val = _DbCommand.ExecuteScalar();
                _DbCommand.Parameters.Clear(); //clear parameters
                return val;
            }
            /// <summary>
            /// Executes a query and retourns the result into a datatable.
            /// </summary>
            /// <param name="QueryText">Query text</param>
            /// <param name="CmdType">Command type</param>
            /// <returns>Datatable containing the result</returns>
            public DataTable ExecuteReaderQuery(string QueryText, CommandType CmdType)
            {
                DataSet myDs = new DataSet();
                _DbCommand.CommandText = QueryText;
                _DbCommand.CommandType = CmdType;
                OpenConnection();
                _DbDataAdapter.Fill(myDs);
                return myDs.Tables[0];
            }
            /// <summary>
            /// Executes a parametred query and retourns the result into a datatable
            /// </summary>
            /// <param name="QueryText">Query text</param>
            /// <param name="QueryParameters">Command type</param>
            /// <param name="CmdType">Parameters list</param>
            /// <returns></returns>
            public DataTable ExecuteReaderQuery(string QueryText, Dictionary<string, object> QueryParameters, CommandType CmdType)
            {
                _DbDataAdapter.SelectCommand.Parameters.Clear();
                foreach (KeyValuePair<string, object> k in QueryParameters)
                {
                    _DbDataAdapter.SelectCommand.Parameters.Add(CreateParameter(k.Key, k.Value));
                }
                DataTable val = this.ExecuteReaderQuery(QueryText, CmdType);
                _DbCommand.Parameters.Clear(); //clear parameters
                return val;
            }
            /// <summary>
            /// Executes a query and retourns affected rows number
            /// </summary>
            /// <param name="QueryText">Query text</param>
            /// <param name="CmdType">Command Type</param>
            /// <returns></returns>
            public int ExecuteNonQuery(string QueryText, CommandType CmdType)
            {
                _DbCommand.CommandText = QueryText;
                _DbCommand.CommandType = CmdType;
                OpenConnection();
                return _DbCommand.ExecuteNonQuery();
            }
            /// <summary>
            /// Executes a parametred query and retourns affected rows number
            /// </summary>
            /// <param name="QueryText">Query text</param>
            /// <param name="QueryParameters">Query parameters</param>
            /// <param name="CmdType">Command type</param>
            /// <returns>Integer value representing affected rows</returns>
            public int ExecuteNonQuery(string QueryText, Dictionary<string, object> QueryParameters, CommandType CmdType)
            {
                _DbCommand.Parameters.Clear();
                foreach (KeyValuePair<string, object> k in QueryParameters)
                {
                    _DbCommand.Parameters.Add(this.CreateParameter(k.Key, k.Value));
                }
                int val = this.ExecuteNonQuery(QueryText, CmdType);
                _DbCommand.Parameters.Clear();
                return val;
            }
        }
    }
    il vaut mieux prendre son pied que de se prendre la tête!!

    http://bossun.noxblog.com

  17. #17
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2006
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 214
    Points : 169
    Points
    169
    Par défaut
    un travail grandiose , je m'attendais pas à ce que tu reprenne ta classe pour moi !
    Pour le moment, je suis entrain de le relire, et faire de petite modif pour intégrer l'utilisation d'instance mais rien de bien méchant

    [Edit]
    pour le moment je peux me connecter à mes 2 bases et j'ai adapté le code pour une plus grande rapidité de traitement, je savais qu'un champ du formulaire qui ne servais pas encore pourrait m'être utile

    Voici, le constructeur que ça me donne avec des écriture dans la sortit du débogueur pour une meilleurs visibilité du test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
     
    public CrmDbClient(string DBType, string ServerName, string ServeurIP, int Port, string DbName, string UserName, string Password, string Instance = null)
            {
                //Ici tu ajoute la chaine de connexion que tu veux gérer avec leur providers
                cnxProvider.Add("System.Data.SqlClient", "Data Source={0}\\{3};Initial Catalog={4};User ID={5};Password={6}");  //sql server
                cnxProvider.Add("MySql.Data.MySqlClient", "SERVER={1}; DATABASE={4}; User id={5}; PWD={6};");// mysql
                //Construction de la chaine de connexion + provider
                ConnectionStringSettings cnx = new ConnectionStringSettings();
                switch (DBType.ToUpper())
                {
                    case "MYSQL":
                        {
                            cnx.ProviderName = "MySql.Data.MySqlClient";
                            cnx.ConnectionString = string.Format("SERVER={0}; DATABASE={1}; User id={2}; PWD={3};", ServeurIP, DbName, UserName, Password);
                            CreateConnectionToDB(cnx);
                            System.Diagnostics.Debug.WriteLine("connection MySQL active via " + _DbFactory.ToString());
                            break;
                        }
                    case "MSSQL":
                        {
                            cnx.ProviderName = "System.Data.SqlClient";
                            cnx.ConnectionString = string.Format("Data Source={0}\\{1};Initial Catalog={2};User ID={3};Password={4}", ServerName, Instance, DbName, UserName, Password);
                            CreateConnectionToDB(cnx);
                            System.Diagnostics.Debug.WriteLine("connection MSSQL active via " + _DbFactory.ToString());
                            break;
                        }
                    default :
                        {
                            // on parcourt toutes les chaines de connexion que tu as ajouté en haut
                            foreach (KeyValuePair<string, string> k in cnxProvider)
                            {
                                //Construction de la chaine de connexion + provider
                                ConnectionStringSettings cnxUnknown = new ConnectionStringSettings();
     
                                cnxUnknown.ProviderName = k.Key;
                                cnxUnknown.ConnectionString = string.Format(k.Value, new object[] { ServerName, ServeurIP, Port, Instance, DbName, UserName, Password });
     
                                // Test de connexion. 
                                if (CreateConnectionToDB(cnxUnknown))
                                {
                                    // Si ok, on quitte la boucle foreach
                                    break;
                                }
                            }
                            if (_DbConnection.State != ConnectionState.Open)
                            {
                                System.Diagnostics.Debug.WriteLine("connection inactive");
                                break;
                            }
                            System.Diagnostics.Debug.WriteLine("connection default active via " + _DbFactory.ToString());
                            break;
                        }
                }
    Maintenant va me falloir faire des requêtes sur mes bases et sortir les résultats

    Plus d'info d'ici la la semaine prochaine en tout cas un grand merci pour le coup de main
    je laisse en non résolut, le temps des tests

    [/Edit]
    règle numéro 12 : toujours s'offrir une entrée charismatique !

  18. #18
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Je croyais que tu faisais
    Citation Envoyé par ben_skywalker Voir le message
    comme si je ne savais pas ce qu'il y a derrière le site. ça peux être n'importe qu'elle base de donnée
    Or dans la signature de ton constructeur tu passes un "DBType"??? public CrmDbClient(string DBType, string ...). En fait, contrairement à ce que tu dis, quand tu instancies ta classe "CrmDbClient" tu sais déjà tout!! Tu n'as donc aucun intérêt à utiliser autre chose que le framework et à ne pas utiliser autre chose que DbProviderFactories... Tu n'as besoin que d'un générateur de chaînes de connections (pas un générateur de connections, juste les chaînes).

    Sinon, tu ne résous pas le premier des deux problèmes:
    Citation Envoyé par bossun Voir le message
    tu as 2 problèmes.
    1.- tu dois écrie du sql pour tous les types de base de de données en respectant les particularité de chaque système
    Si tu gère des "millions de tuples" il va forcement falloir optimiser. C'est un peu contraire à une logique très générique. Comment comptes-tu adapter tes requêtes en fonction des types de DBDD?

    @bossun, honnêtement tu te compliques la vie et tu prends des risques en créant par avance des objets dont tu n'as pas forcement besoin. Par exemple, ton constructeur va créer un dataadapter. Il est inutile si je ne veux que appeler la méthode "ExecuteScalarQuery".

    De plus, ton implémentation d'un objet disposable est incorrecte. Jette un oeil ici: http://msdn.microsoft.com/fr-fr/magazine/cc163392.aspx.

    Enfin, l'utilisation d'un DataAdapter pour la lecture en avant seulement d'une base de données est juste un tueur de performances (surtout si il y a des millions de tuples). Il faut renvoyer un IDataReader: http://msdn.microsoft.com/fr-fr/libr...atareader.aspx.

    Un conseil, utilisez le Framework.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  19. #19
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2006
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 214
    Points : 169
    Points
    169
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    Je croyais que tu faisais Or dans la signature de ton constructeur tu passes un "DBType"??? public CrmDbClient(string DBType, string ...). En fait, contrairement à ce que tu dis, quand tu instancies ta classe "CrmDbClient" tu sais déjà tout!! Tu n'as donc aucun intérêt à utiliser autre chose que le framework et à ne pas utiliser autre chose que DbProviderFactories... Tu n'as besoin que d'un générateur de chaînes de connections (pas un générateur de connections, juste les chaînes).
    Pour moi mon DBType == ("MYSQL" || "MSSQL")
    Lorsque tu me parle de DbProviderFactories j'ai bien vue des exemple pour lesquelles il est utilisé, récupéré via la chaîne de connexion OR lorsque j'essais de le récupérer, moi ça me génère une exeption comme indiquer précédemment... Voilà pourquoi je ne l'utilise pas à moins d'avoir un exemple de définition dans une chaîne de connexion chose que pour le moment, en aillant rechercher sur différent site je n'est Pas trouvé, je ne saurais utilisé quelque chose qui me fait planter mon programme!

    Citation Envoyé par Immobilis Voir le message
    Sinon, tu ne résous pas le premier des deux problèmes:Si tu gère des "millions de tuples" il va forcement falloir optimiser. C'est un peu contraire à une logique très générique. Comment comptes-tu adapter tes requêtes en fonction des types de DBDD?
    j'ai tester l'intégralité de mes requêtes sur MSSQL et MySQL toutes sont compatible!
    voici un exemple que de requête que je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string req = "INSERT INTO groups(champ1, champ2, champ3, champ4)";
    req += string.format("VALUES({0},{1},{2},{3}", MonChamp1, MonChamp2, MonChamp3, MonChamp4);";
    et a nouveau comme écrit plus haut, pas de problème de compatibilité. Maintenant je ne doute pas qu'il existe quelque part un type de base de données n'acceptant ce type de requêtes mais pour le moment ce n'est pas le problème! ce que je veux c'est vraiment m'affranchir des sqlconnection ou mysqlconnection...

    Pour moi et pour le moment au vue des tests réalisé la solution de bossun est fonctionnel! il me resterais juste à la modifier car j'aime pas trop l'utilisation des DataTable ^^ enfin surtout que je ne les ai jamais utilisé j'ai préféré les DataReader plus simple à parcourir

    Mais au vue des différents commentaires, je vais vraiment me pencher sur l'interface
    règle numéro 12 : toujours s'offrir une entrée charismatique !

  20. #20
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    j'ai tester l'intégralité de mes requêtes sur MSSQL et MySQL toutes sont compatible!
    Le premier problème que tu devrais rencontrer est dans la récupération des valeurs attribuées au champs AutoIncrément après un INSERT.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

Discussions similaires

  1. Réponses: 8
    Dernier message: 16/11/2013, 06h05
  2. [ADO.NET] [DAC] Plusieurs types de base de données
    Par BenoitM dans le forum Accès aux données
    Réponses: 4
    Dernier message: 07/12/2006, 11h31
  3. différents types de bases de données
    Par Alvergnat dans le forum Access
    Réponses: 2
    Dernier message: 18/06/2005, 17h06
  4. [CR]Changement de type de base de donnée
    Par nabil dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 12/04/2004, 22h42
  5. Réponses: 4
    Dernier message: 06/02/2004, 16h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo