begin process at 2012 02 07 10:45:42
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Base de données

 > SQLMANAGER : FACILITE L'ACCÈS À UNE BASE DE DONNÉE MS SQL

SQLMANAGER : FACILITE L'ACCÈS À UNE BASE DE DONNÉE MS SQL


 Information sur la source

 Description

Salut tout le monde,
Aujourd'hui, je veux partager avec vous une classe simple et efficace qui vous permet d'executer des requêtes SQL vers un serveur MS SQL.
Cette classe est thread-safe et conçu en Singleton.
Elle permet la gestion des erreurs grâce aux classes QueryResult, SqlQueryResult, SqlNonQueryResult.
Finalement, elle copie les données récupérées dans le DataReader vers une table (DataTable) afin de pouvoir consulter les données en mode déconnecter.

Source

  • using System;
  • using System.Collections.Generic;
  • using System.Data;
  • using System.Data.Common;
  • using System.Data.SqlClient;
  • using System.Text;
  • using System.Runtime.Remoting.Contexts;
  • namespace zAlbumManager
  • {
  • public class SqlManager : IDisposable
  • {
  • //SqlManager est une classe Singleton
  • private static SqlManager sqlmanager = new SqlManager();
  • private string connectionString = AppSettings.ConnectionString;
  • private SqlConnection sqlConnection;
  • private bool disposed = false;
  • //contient la dernière erreur survenue
  • private string lastError;
  • public string LastError { get { return lastError; } }
  • #region Constructeur
  • private SqlManager()
  • {
  • sqlConnection = new SqlConnection(connectionString);
  • OpenConnection();
  • }
  • public static SqlManager GetInstance()
  • {
  • return sqlmanager;
  • }
  • #endregion
  • #region ExecuteQuery
  • public SqlQueryResult ExecuteQuery(string query, SqlParameter[] parameters)
  • {
  • lock (this)
  • {
  • SqlQueryResult sqr = new SqlQueryResult();
  • SqlCommand sqlCommand = new SqlCommand(query, sqlConnection);
  • if (parameters != null) sqlCommand.Parameters.AddRange(parameters);
  • SqlDataReader sqlDataReader = null;
  • try
  • {
  • sqlDataReader = sqlCommand.ExecuteReader();
  • }
  • catch (Exception e)
  • {
  • lastError = sqr.ErrorMessage = e.Message;
  • sqr.IsSuccess = false;
  • sqr.Error = Error.DataBaseAccessError;
  • }
  • if (sqr.IsSuccess)
  • {
  • sqr.Table = new DataReaderAdapter().FillFromReader(sqlDataReader);
  • sqlDataReader.Close();
  • }
  • return sqr;
  • }
  • }
  • public SqlQueryResult ExecuteQuery(string query)
  • {
  • return this.ExecuteQuery(query, null);
  • }
  • #endregion
  • #region ExecuteNonQuery
  • public SqlNonQueryResult ExecuteNonQuery(string query, SqlParameter[] parameters)
  • {
  • lock (this)
  • {
  • SqlNonQueryResult snqr = new SqlNonQueryResult();
  • SqlCommand sqlCommand = new SqlCommand(query, sqlConnection);
  • if (parameters != null) sqlCommand.Parameters.AddRange(parameters);
  • try
  • {
  • //sqlConnection.Open();
  • snqr.NumberOfRowsAffected = sqlCommand.ExecuteNonQuery();
  • }
  • catch (Exception e)
  • {
  • lastError = snqr.ErrorMessage = e.Message;
  • snqr.IsSuccess = false;
  • snqr.Error = Error.DataBaseAccessError;
  • }
  • return snqr;
  • }
  • }
  • public SqlNonQueryResult ExecuteNonQuery(string query)
  • {
  • return this.ExecuteNonQuery(query, null);
  • }
  • #endregion
  • #region OpenConnection
  • public void OpenConnection()
  • {
  • try
  • {
  • sqlConnection.Open();
  • }
  • catch (Exception e)
  • {
  • lastError = e.Message;
  • }
  • }
  • #endregion
  • #region CloseConnection
  • public void CloseConnection()
  • {
  • if (sqlConnection.State != ConnectionState.Closed) sqlConnection.Close();
  • }
  • #endregion
  • #region IDisposable Membres
  • public void Dispose()
  • {
  • if (!this.disposed)
  • {
  • CloseConnection();
  • sqlConnection.Dispose();
  • disposed = true;
  • }
  • GC.SuppressFinalize(this);
  • }
  • #endregion
  • }
  • #region QueryResult
  • public class QueryResult
  • {
  • private bool isSuccess = true;
  • private string errorMessage;
  • private Error error;
  • public Error Error { get { return error; } set { error = value; } }
  • public bool IsSuccess { get { return isSuccess; } set { isSuccess = value; } }
  • public string ErrorMessage { get { return errorMessage; } set { errorMessage = value; } }
  • public override string ToString()
  • {
  • return " - IsSuccess : " + isSuccess + "\n" + " - Error : " + error + "\n" + " - ErrorMessage : " + errorMessage;
  • }
  • }
  • #endregion
  • #region SqlQueryResult
  • public class SqlQueryResult : QueryResult
  • {
  • private DataTable table;
  • public DataTable Table { get { return table; } set { table = value; } }
  • }
  • #endregion
  • #region SqlNonQueryResult
  • public class SqlNonQueryResult : QueryResult
  • {
  • private int numberOfRowsAffected;
  • public int NumberOfRowsAffected { get { return numberOfRowsAffected; } set { numberOfRowsAffected = value; } }
  • }
  • #endregion
  • #region DataReaderAdapter
  • class DataReaderAdapter : DbDataAdapter
  • {
  • public DataTable FillFromReader(IDataReader dataReader)
  • {
  • DataTable dt = new DataTable();
  • this.Fill(dt, dataReader);
  • return dt;
  • }
  • }
  • #endregion
  • }
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Text;
using System.Runtime.Remoting.Contexts;

namespace zAlbumManager
{
public class SqlManager : IDisposable
{
    //SqlManager est une classe Singleton
    private static SqlManager sqlmanager = new SqlManager();
    private string connectionString = AppSettings.ConnectionString;
    private SqlConnection sqlConnection;
    private bool disposed = false;
    //contient la dernière erreur survenue
    private string lastError;
    public string LastError { get { return lastError; } }

    #region Constructeur
    private SqlManager()
    {
        sqlConnection = new SqlConnection(connectionString);
        OpenConnection();
    }
    public static SqlManager GetInstance()
    {
        return sqlmanager;
    }
    #endregion

    #region ExecuteQuery
    public SqlQueryResult ExecuteQuery(string query, SqlParameter[] parameters)
    {
        lock (this)
        {
            SqlQueryResult sqr = new SqlQueryResult();
            SqlCommand sqlCommand = new SqlCommand(query, sqlConnection);
            if (parameters != null) sqlCommand.Parameters.AddRange(parameters);
            SqlDataReader sqlDataReader = null;
            try
            {
                sqlDataReader = sqlCommand.ExecuteReader();
            }
            catch (Exception e)
            {
                lastError = sqr.ErrorMessage =  e.Message;
                sqr.IsSuccess = false;
                sqr.Error = Error.DataBaseAccessError;
            }
            if (sqr.IsSuccess)
            {
                sqr.Table = new DataReaderAdapter().FillFromReader(sqlDataReader);
                sqlDataReader.Close();
            }
            return sqr;
        }
    }
    public SqlQueryResult ExecuteQuery(string query)
    {
        return this.ExecuteQuery(query, null);
    }
    #endregion
    #region ExecuteNonQuery
    public SqlNonQueryResult ExecuteNonQuery(string query, SqlParameter[] parameters)
    {
        lock (this)
        {
            SqlNonQueryResult snqr = new SqlNonQueryResult();
            SqlCommand sqlCommand = new SqlCommand(query, sqlConnection);
            if (parameters != null) sqlCommand.Parameters.AddRange(parameters);
            try
            {
                //sqlConnection.Open();
                snqr.NumberOfRowsAffected = sqlCommand.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                lastError = snqr.ErrorMessage = e.Message;
                snqr.IsSuccess = false;
                snqr.Error = Error.DataBaseAccessError;
            }
            return snqr;
        }
    }
    public SqlNonQueryResult ExecuteNonQuery(string query)
    {
        return this.ExecuteNonQuery(query, null);
    }
    #endregion


    #region OpenConnection
    public void OpenConnection()
    {
        try
        {
            sqlConnection.Open();
        }
        catch (Exception e)
        {
            lastError = e.Message;
        }
    }
    #endregion
    #region CloseConnection
    public void CloseConnection()
    {
        if (sqlConnection.State != ConnectionState.Closed) sqlConnection.Close();
    }
    #endregion

    #region IDisposable Membres
    public void Dispose()
    {
        if (!this.disposed)
        {
            CloseConnection();
            sqlConnection.Dispose();
            disposed = true;
        }
        GC.SuppressFinalize(this);
        
    }
    #endregion
}
#region QueryResult
public class QueryResult
{
    private bool isSuccess = true;
    private string errorMessage;
    private Error error;
    public Error Error { get { return error; } set { error = value; } }
    public bool IsSuccess { get { return isSuccess; } set { isSuccess = value; } }
    public string ErrorMessage { get { return errorMessage; } set { errorMessage = value; } }

    public override string ToString()
    {
        return " - IsSuccess : " + isSuccess + "\n" + " - Error : " + error + "\n" + " - ErrorMessage : " + errorMessage;
    }
}
#endregion 
#region SqlQueryResult
    public class SqlQueryResult : QueryResult
    {
        private DataTable table;
        public DataTable Table { get { return table; } set { table = value; } }
    }
    #endregion
#region SqlNonQueryResult
public class SqlNonQueryResult : QueryResult
{
    private int numberOfRowsAffected;
    public int NumberOfRowsAffected { get { return numberOfRowsAffected; } set { numberOfRowsAffected = value; } }
}
#endregion

#region DataReaderAdapter
class DataReaderAdapter : DbDataAdapter
{
    public DataTable FillFromReader(IDataReader dataReader)
    {
        DataTable dt = new DataTable();
        this.Fill(dt, dataReader);
        return dt;
    }
}
#endregion
}

 Conclusion

Je suis ouvert à tous conseils pour améliorer cette classe.
Je l'utilise beaucoup et le mieux qu'elle se comporte, meilleur seront mes programmes.


 Sources du même auteur

Source avec Zip Source avec une capture Source .NET (Dotnet) RESOURCEBINDER : INJECTER ET EXTRAIRE DES RESSOURCES
Source .NET (Dotnet) CONVERSION ASCII-8 - BINAIRE
Source avec Zip Source avec une capture Source .NET (Dotnet) CRYPTAGE PRÉDÉFINI ET PERSONNALISÉ GRÂCE À LA COMPILATION DY...
Source avec Zip Source avec une capture Source .NET (Dotnet) PACMAN : ÉDITEUR DE NIVEAU
Source avec Zip Source avec une capture Source .NET (Dotnet) PLUGIN PROGRAMME EXTENSIBLE GRÂCE AUX MODULES

 Sources de la même categorie

Source .NET (Dotnet) ENTITY FRAMEWORK - AVOIR UN INCLUDE TYPÉ par jesusonline
Source avec Zip APPLICATION BASE DE DONNÉES par pretude
Source avec Zip Source avec une capture Source .NET (Dotnet) CRÉATION DE CLASSES MÉTIERS À PARTIR D'UNE BASE DE DONNÉES par sebmafate
Source avec Zip Source avec une capture Source .NET (Dotnet) C# SQLCE DEMO par DanMor498
Source avec Zip EXPORTATION DE FICHIER CSV VERS UNE TABLE SQLSERVER par imothepe_33

 Sources en rapport avec celle ci

Source avec Zip Source .NET (Dotnet) CRYSTALREPORT C# SQLSERVER par badis1996
Source avec Zip Source avec une capture Source .NET (Dotnet) SPLIT SQL SANS TABLE TEMPORAIRE par TheOnlyMaX
Source avec Zip Source avec une capture Source .NET (Dotnet) GENEREREQUÊTE par donald42
Source avec Zip Source avec une capture Source .NET (Dotnet) MSMQ UI MANAGER par TigrouMeow
Source avec Zip Source avec une capture Source .NET (Dotnet) REPOSITORY GENERATOR (FOR ENTERPRISE LIBRARY) par romagny13

Commentaires et avis

Commentaire de Alain Proviste le 19/08/2006 12:56:43 administrateur CS

je n'ai pas regardé le code mais à lire la description, on se dit "que demande le peuple?"

:)

Commentaire de svaroteaux le 21/08/2006 10:11:30

Il y a une "Application Block" de Microsoft qui répond déjà à cette problématique : Microsoft Application Blocks for .NET

Cette librairie est plutôt bien faite et performante. Elle permet de travailler avec des DataSet ou des SqlReader.
Le package propose une documentation très claire.

Où la trouver : http://www.microsoft.com/downloads/details.aspx?FamilyID=F63D1F0A-9877-4A7B-88EC-0426B48DF275&displaylang=en


Description par Microsoft :
The Microsoft Data Access Application Block for .NET consists of a single .NET-based assembly, which contains all of the functionality necessary to perform the most common data access tasks against a Microsoft SQL Server 2000 database.
Specifically, the Data Access Application Block helps you:
- Call stored procedures or SQL text commands.
- Specify parameter details.
- Return SqlDataReader, DataSet, XmlReader objects, or single values.
- Use strongly typed table and field names.
- Support parameter caching, where required.
- Allow additional tables to be added by passing in pre-existing datasets.
- Update a dataset with user-specified update commands.
- Create SqlCommand objects.
- Allow strongly typed data rows to be passed in place of parameters.

Commentaire de dirthangel le 21/03/2007 13:36:34

Salut j'ai un problème avec ta class quand j'essaie de la cpompilé j'obtient l'erreur

Error 8 The name 'Error' does not exist in the current context F:\Teddy\Visual Studio 2005\Projects\Mail\SqlClassManager\SqlClassManager.cs 102 34 SqlClassManager

Je débute en C# donc je ne sais pas trop d'ou sa vient , je pense qu'il me manque une référence mais je ne sais pas a quoi :s

merci de votre aide


Commentaire de badrbadr le 21/03/2007 16:02:17

oups, tu peux commenter les deux lignes dans QueryResult comme ça :
//private Error error;
//public Error Error { get { return error; } set { error = value; } }
ou encore juste créer une énumération bidon genre :
public enum Error
{
  Unknown
}

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

SQL Manager Add-in [ par zebobo5 ] Bonjour,Je cherche à faire un add-in pour Sql Server Manager, est ce que quelqu'un à un code, ou un tuto, un template, ou je ne sais quoi qui pourrai Modification d'une base sql avec sql express [ par Fildomen ] sltje veux modifier le contenu de qlq tables de ma base, mais g rien trouver de ce genre dans sql express 2005, et même quand g installé son express m désinstallation des serveurs sql [ par Fildomen ] salutj'ai installé plusieurs sql server express, et chacun a ajouté un serveur dans mon pc, et quand j'ai tout désinstallé, les serveurs restent, et j base sql problème [ par Fildomen ] salut ( 4fois par jour!!)j'ai réinstaller le windows, et quand je veux attacher ma base de donnée sql server 2000, il me passe une erreur&nb XML dans SQL server [ par lorenzo2603 ] Bonjour à tous!! Je manipule des fichiers XML et je voudrai enregistrer les données des XML dans SQL server sous forme de table. J'ai beauc sql command problème [ par Fildomen ] Salutje veux selectionner d'une base les cellules qui sont classés de 1000 à 1100 après d'avoir appliquer un order by, comment faire??? Program Manager [ par fdouieb ] Est-il possible en C# d'ouvrir la fenêtre d'arrêt de l'ordinateur l'équivalent en VB de AppActivate ("Program Manager") si je ne me tro FDF + PDF + SQL SERVER2000 + C# + ASPX [ par rabbiwan ] Bonjour,le titre est long, je sais mais il regroupe pas mal d'infoVoila je développe un site internet en aspx et c# ou je dois générer SQL [ par abdoulax ] Je voudrai créer un client SQL permettant de parcourir les données d'un serveur mysql.Je voudrais savoir s'il me suffit d'utiliser la librai Selection dans le Datagrid avec connection SQL [ par Sead ] Bonjour a tous,J'arrive à acceder aux données contenues dans mon unique table et j'affiche une partie d'entre elles dans mon datagrid. Par e


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,607 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales