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

Accès aux données Discussion :

Comment coupler au mieux SQLite et C# pour requêter facilement?


Sujet :

Accès aux données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Points : 79
    Points
    79
    Par défaut Comment coupler au mieux SQLite et C# pour requêter facilement?
    Bonjour,

    Je suis en train de réaliser une application cliente en WPF.
    J'ai plusieurs contraintes techniques:
    - Framework .NET 3.5 sans le SP1
    - Base de données SQLite

    Étant novice en la matière je voudrais savoir quoi utiliser pour requêter ma base de données facilement. A savoir que :
    - Entity Framework (LinqToEntites / EDMX) : impossible seulement à partir du 3.5 SP
    - LinqToSQL : compatible seulement avec SQL Server.

    J'ai trouvé le provider suivant:
    Sytem.Data.SQLite

    Pour l'instant voilà comment je l'utilise:
    Code c# : 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
     
    public List<UserEntity> GetAll()
    {
    	DatabaseSqlite db = new DatabaseSqlite();
    	db.Query("select * from utilisateur ORDER BY nom, prenom");
    	return db.Read().Select(CreateUser).ToList();
    }
     
    private static UserEntity CreateUser(SQLiteDataReader row)
    {
    	return (row==null)
    		?null
    		:new UserEntity(){
    					Id = long.Parse(row["id_utilisateur"].ToString()),
    					Lastname = row["nom"].ToString(),
    					Firstname = row["prenom"].ToString()					
    				}
    	;
    }

    Et une petite classe pour me connecter à la base et effectuer les requêtes.
    Code c# : 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
     
    public class DatabaseSqlite
    {
    	private SQLiteConnection _Connection = null;
    	private SQLiteCommand _Command = null;
     
    	public DatabaseSqlite()
    	{
    	   _Connection = new SQLiteConnection(@"Data Source=chemin_vers_le_fichier.db3");
    	   _Connection.Open();
    	}
     
    	public void Query(string query)
    	{
    		_Command = new SQLiteCommand(_Connection);
    		_Command.CommandText = query; 
    	}
     
    	public IEnumerable<SQLiteDataReader> Read()
    	{
    		SQLiteDataReader reader = _Command.ExecuteReader();
    		while(reader.Read()){
    			yield return reader;
     
    		}
    		reader.Close();
    	}
    }

    Ma demande:
    1) Existe il une méthode plus simple ou plus "friendly" pour le développer?
    2) J'ai vu qu'il y a System.Data.SQLite.Linq mais je n'ai pas trouvé d'exemple quand à son utilisation.

    Bref, quelques conseils sont les bienvenus.
    Merci d'avance.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par takinelinfo Voir le message
    1) Existe il une méthode plus simple ou plus "friendly" pour le développer?
    Bah déjà il y a des ORM autres que Linq to SQL ou Entity Framework... par exemple NHibernate. Il y a aussi des outils qui peuvent te générer une DAL, comme Subsonic.

    Si tu veux attaquer la base directement en SQL, à mon avis la classe DatabaseSqlite n'apporte pas grand chose... L'API ADO.NET est bien conçue et s'utilise très bien sans y ajouter une classe intermédiaire.

    Si tu tiens à garder cette approche, quelques conseils :

    - Implémente l'interface IDisposable dans ta classe DatabaseSqlite, ferme la connexion dans le Dispose, et utilise la classe dans un bloc using. Avec ton code actuel, la connexion n'est fermée que quand le GC détruit l'objet SQLiteConnection, et tu n'as aucun contrôle sur quand ça se produit.

    - Dans ta méthode Read, renvoie le type le plus générique possible (en l'occurrence IDataRecord, qui est implémentée par les DataReader), plutôt que SQLiteDataReader. Ca t'évitera d'avoir plein de chode à modifier si un jour tu veux changer de SGBD ou de provider ADO.NET.

    - Je ne vois pas vraiment de raison de séparer les méthodes Query et Read... ça t'oblige à stocker la commande dans un champ de la classe, ce qui la rend non thread-safe (pas très grave pour ce que tu vas probablement en faire, mais bon...). J'aurais plutôt fait un truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public IEnumerable<IDataRecord> Query(string commandText)
    {
        using (var command = _connection.CreateCommand())
        {
            command.Text = commandText;
            using (var reader = command.ExecuteReader())
            {
                while(reader.Read())
                    yield return reader;
            }
        }
    }
    D'ailleurs tu pourrais implementer ça comme une méthode d'extension sur IDbConnection, et là tu n'aurais plus du tout besoin de la classe DatabaseSQLite...

    Citation Envoyé par takinelinfo Voir le message
    2) J'ai vu qu'il y a System.Data.SQLite.Linq mais je n'ai pas trouvé d'exemple quand à son utilisation.
    C'est le provider Linq pour Entity Framework, tu ne peux pas l'utiliser sans le SP1.

  3. #3
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    public IEnumerable<IDataRecord> Query(string commandText)
    {
    using (var command = _connection.CreateCommand())
    {
    command.Text = commandText;
    using (var reader = command.ExecuteReader())
    {
    while(reader.Read())
    yield return reader;
    }
    }
    }

    Je doute que çà vous suffise... il faudra faire une surcharge pour gérer les requêtes paramétrée avec SqlParameters...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Points : 79
    Points
    79
    Par défaut
    @tomlev:
    Merci pour toutes ces infos. Je ne sais pas vraiment si j'ai intérêt à partir vers un ORM ou me contenter des requêtes SQL.

    @iberserk:
    Bien entendu cette méthode n'est pas complète. C'était plus pour montrer une façon de faire que présenter quelque chose de complet

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Points : 2 202
    Points
    2 202
    Par défaut
    fluent NHIBERNATE. Jamais utiliser SQL Lite ne sera plus simple. Tu trouveras même les snippets sur le site de FluentNH (création de la base, initialisiation..)

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par B.AF Voir le message
    fluent NHIBERNATE. Jamais utiliser SQL Lite ne sera plus simple
    A voir... un ORM, dans le principe c'est génial, mais dès que tu commences à faire des choses un peu plus compliquées tu te heurtes à plein de problèmes que tu n'aurais jamais eus avec du bon vieux SQL. Je ne connais pas Fluent NHibernate, mais avec NHibernate tout court + SQLite on a eu toutes sortes de problèmes au boulot. Bon, c'est sans doute parce qu'on sait pas bien l'utiliser, mais dire que c'est "simple", je pense que c'est quand même un peu trompeur...

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Points : 2 202
    Points
    2 202
    Par défaut
    Oui tu as raison. Quand je dis simple, je dis simple à mettre en oeuvre; après je n'ai jamais utilisé SQL Lite pour autre chose que des dev triviaux (20 tables et pas bcp de données; ou un registre local). Donc je ne suis pas nécessairement au fait des pb de SQL Lite.

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/03/2014, 14h14
  2. Réponses: 13
    Dernier message: 28/05/2006, 15h05
  3. [Droits] Comment garantir au mieux la confidentialité ?
    Par mencaglia dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 06/02/2006, 09h39
  4. Réponses: 3
    Dernier message: 06/01/2006, 08h57
  5. Comment apeler une variable d'un etat pour le VBA
    Par chetflo dans le forum Access
    Réponses: 2
    Dernier message: 26/11/2005, 13h40

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