Calendrier

Novembre 2009
L M M J V S D
            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            
<< < > >>

Présentation

Recherche

W3C

  • Flux RSS des articles

ADO.NET 1.0 - 2.0

Using Data Across Multiple Windows Forms
un article de Beth Massi

http://blogs.msdn.com/bethmassi/archive/2007/10/01/using-data-across-multiple-windows-forms.aspx
Par Romagny13
Ecrire un commentaire - Voir les 0 commentaires - Recommander
Récupérer les paramètres d’entrée et de sortie des procèdures stockées SQL Server en C#
1 – pour récupérer les paramètres en entrée
C'est-à-dire ceux que l’on trouve  ici
CREATE PROCEDURE nomprocedure(@param1 int,@param2 char(100))
 
C’est très simple il suffit de passer par la méthode GetSchema() de la SqlConnection
Exemple :
DataTable dataTable = connection.GetSchema("ProcedureParameters", newstring[] { null, null, "UpdateContact",  });
 
2 – pour récupérer les paramètres en sortie
C'est-à-dire ceux qui sont renvoyés dans une procédure de type « select »
CREATE PROCEDURE nomprocedure(@param1 int,@param2 char(100))
AS
BEGIN
SELECT [Colonne1],[Colonne2]
FROM dbo.[NomTable]
END
GO
 
 
            SqlConnection connection = new SqlConnection("Data Source=.;Initial Catalog=ContractDb;Integrated Security=SSPI;");
 
            SqlCommand command = new SqlCommand();
            command.CommandText = "dbo.NomProcedure";
            command.CommandType = CommandType.StoredProcedure;
            command.Connection = connection;
 
            connection.Open();
            SqlDataReader reader =   command.ExecuteReader(CommandBehavior.SchemaOnly);
 
            DataTable dt = reader.GetSchemaTable();
 

il suffit ensuite de boucler sur chaque row de la datatable et récupérer par exemple le nom de la colonne avec row["ColumnName"].ToString() 
il est trés facile de voir la table en debuggage avec le visualisateur de debuggage de Visual Studio 2005
Par Romagny13
Ecrire un commentaire - Voir les 0 commentaires - Recommander
SQL Server 2005 –
récupérer des informations sur la base avec le T-SQL
 
Databases
/* récupérer toutes les bases de données*/
select * from sys.databases
 
Tables
/* récupérer toutes les tables de la base de données*/
select name,object_id from sys.tables
 
Columns
/* récupèrer les colonnes de la table Contact */
select * from sys.tables t,sys.columns c
where t.object_id=c.object_id
and t.name='Contact'
 
Primary key
/* récupérer les clés primaires de la table Contact*/
select * from sys.tables t,sys.indexes p
where t.object_id=p.object_id
and t.name='Contact'
 
 
Foreign keys
/* récupèrer les clés étrangères */
select * from sys.foreign_keys
select * from sys.foreign_key_columns
 
/*
select * from sys.foreign_key_columns
-donne la table clé primaire
avec referenced_object_id
-donne la table clé etrangère avec parent_object_id
*/
 
select distinct
pt.name as PK_TABLE_NAME,
ft.name as FK_TABLE_NAME,
pc.name as PK_COLUMN_NAME,
fc.name as FK_COLUMN_NAME,
f.name as RELATION_NAME
from
sys.tables pt,
sys.tables ft,
sys.columns pc,
sys.columns fc,
sys.foreign_keys f,
sys.foreign_key_columns k,
sys.indexes i
where
pt.object_id = f.referenced_object_id and
ft.object_id = f.parent_object_id and
pc.object_id = f.referenced_object_id and
fc.object_id = f.parent_object_id and
pc.column_id = k.referenced_column_id and
fc.column_id = k.parent_column_id
 
 
Procédures stockèes et paramètres
/* récupération des procédures stockées */
select * from sys.procedures
 
/* récupération des paramètres de procédure UpdateContact*/
select * from sys.procedures pr,sys.parameters pa
where pr.object_id=pa.object_id
and pr.name='UpdateContact'
 
On peut observer les vues et fonctions existantes (grâce à SQL Server Management Studio)
 
Il faut savoir également qu’en C# on peut très facilement récupèrer des informations par l’intermédiaire
De la méthode GetSchema() d’une conexion Sql (SqlConnection)
Il suffit alors de passer en paramètres le nom des éléments à rechercher ainsi que des restrictions(pour cibler)
Exemples :
DataTable dataTable = connection.GetSchema("tables")
DataTable dataTable = connection.GetSchema("tables", new string[] { null, null, "Contact",  });
DataTable dataTable = connection.GetSchema("Procedures")
DataTable dataTable = connection.GetSchema("ProcedureParameters", new string[] { null, null, "UpdateContact",  });
 
 
Vous pouvez très facilement récupérer la liste (CollectionNames) de tout ce que l’on peut rechercher avec GetSchema()
DataTable dt = Connection.GetSchema();
foreach (DataRow row in dt.Rows)
{
//row["CollectionName"]
}
Par Romagny13
Ecrire un commentaire - Voir les 0 commentaires - Recommander
SqlDependency – 3 choses importantes

La requete
SELECT [ProductID],[ProductName],[SupplierID],[CategoryID],[QuantityPerUnit],[UnitPrice],[UnitsInStock],[UnitsOnOrder],[ReorderLevel],[Discontinued] FROM dbo.[Products]
 
1 – doit  comporter les noms des  colonnes et surtout pas utiliser * (exemple : select * from dbo.[Products])
2 – doit avoir dbo devant tous les noms des tables
3 – actuellement seuls SQL Server et SQL Server 2005 Express peuvent réellement utiliser SqlDependency
Je n’ai pas réussi   encore pour les fichiers locaux(*.mdf) Sql Server Express                
De plus il faut parfois  valider Service broker avec une requete style
ALTER DATABASE [DatabaseName] SET ENABLE_BROKER;                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
Par Romagny13
Ecrire un commentaire - Voir les 0 commentaires - Recommander
[ Caching ] - Une classe d’expiration basée sur Sql Dependency pour SQL Server
 
Je me développe ma propre librairie de Caching(celle-ci devra permettre plusieurs types d’expirations :
-          Absolue : le cacheItem devra être supprimé à la date fixée
-          Relative (sliding) : le cacheItem ajouté au cache devra être supprimé dans un temps déterminé
-          Pour SQL Server : je me base sur SqlDependency(pour applications de bureaux),pour le web il faudra que je vois si j’utilise SqlCacheDependency
-          Pour Access : ce sera juste FileSystemWatcher qui « observera » le fichier de base de données *.mdb (ou *.accdb)
Je présente ici ma classe d’expiration basée sur SqlDependency
Cette classe devrait même être utilisable avec Enterprise Library vu que je me base sur les patterns and practices (donc il faudra que je teste mais simplement en l’ajoutant dans les expirations du projet Caching)
public class SqlDependencyExpiration : ICacheItemExpiration
    {
        private bool isExpired;
 
        public SqlDependencyExpiration(SqlCommand command)
        {
            SqlDependency.Stop(command.Connection.ConnectionString);
            SqlDependency.Start(command.Connection.ConnectionString);
 
            command.Notification = null;
            SqlDependency sqlDependency = new SqlDependency(command);
            sqlDependency.OnChange += new OnChangeEventHandler(OnChanged);
 
            if (command.Connection.State == ConnectionState.Closed)
                command.Connection.Open();
 
            command.ExecuteReader(CommandBehavior.CloseConnection);
        }
        void OnChanged(object sender, SqlNotificationEventArgs e)
        {
            SqlDependency sqlDependency = sender as SqlDependency;
            sqlDependency.OnChange -= OnChanged;
            isExpired = true;
        }
 
        #region ICacheItemExpiration Membres
 
        public bool HasExpired()
        {
            return isExpired;
        }
 
        #endregion
 
    }
 
Utilisation :
 private void button1_Click(object sender, EventArgs e)
        {
            DataTable dataTable = new DataTable();
 
            if (manager.Get("1") != null)
            {
                dataTable =(DataTable) manager.Get("1").Value;
                label1.Text = "from cache";
            }
            else
            {
                SqlCommand sqlCommand = new SqlCommand("Select ContactID,Contactname from dbo.[Contact]", new SqlConnection("Data Source=.;Initial Catalog=ContactDB;Integrated Security=SSPI;"));
                sqlCommand.Connection.Open();
                dataTable.Load(sqlCommand.ExecuteReader());
                label1.Text = "from sql server";
               
                manager.Add("1", dataTable, new ICacheItemExpiration[] { new SqlDependencyExpiration(sqlCommand) });
 
            }
            dataGridView1.DataSource = dataTable;
}
 
 
C’est donc un début lorsque tout sera en place peut être que je présenterais plus en détails, sachant qu’à terme cette librairie devrait être ajoutée à un de mes projets > CS2GEN (disponible sur Codeplex et CodeS-SourceS)
Par Romagny13
Ecrire un commentaire - Voir les 0 commentaires - Recommander
System.Threading.Timer –
un timer pour la gestion des expirations d’un cache
 
Cette classe a pour objectif de permettre la gestion des expirations des éléments d’un cache(ces expirations peuvent etre de plusieurs types : absolues,relatives,notifications)
Très simple on utilise un timer,qui sera appelé périodiquement pour vérifier chaque cacheItem du cache n’a pas pas expiré
Logiquement une instance de cette classe devrait etre créée et le timer lancé en même temps que l’on instancie le cache manager
 public class PollTimer :IDisposable
    {
        private System.Threading.Timer timer;
 
        public void StartPolling(TimerCallback callbackMethod, int period)
        {
            if (callbackMethod == null)
                throw new ArgumentNullException("callbackMethod");
            if (period <= 0)
                throw new Exception("period");
 
            timer = new System.Threading.Timer(callbackMethod, null, 1000, period);
        }
 
         public void StopPolling()
        {
            if (timer == null)
                throw new InvalidOperationException("");
 
            Dispose();
        }
 
        #region IDisposable Membres
 
        public void Dispose()
        {
            timer.Dispose();
            timer = null;
        }
 
        #endregion
    }
 
Exemple(code de la form) :
Le timer sera appelé toutes les secondes et affichera un message
 
        PollTimer pollTimer = new PollTimer();
 
        private void button1_Click(object sender, EventArgs e)
        {
            pollTimer.StartPolling(Message, 1000);
        }
 
 
        public void Message(object obj)
        {
            MessageBox.Show("now");
        }
 
 
Par Romagny13
Ecrire un commentaire - Voir les 0 commentaires - Recommander
Générer un DataSet typé par code
I -avec System.Data.Design (System.Design.dll)
(ne pas oublier de faire les imports)
       ///<summary>
        /// Génére un DataSet typé
        ///</summary>
        ///<param name="path">chemin vers le fichier Xml</param>
        ///<param name="Namespace">Namespace à affecter au DataSet créé</param>
        public void GenerateTypedDataSet(string path, string Namespace)
        {
            DataSet dataSet = new DataSet();
            dataSet.ReadXml(path);
            CodeDomProvider codeDomProvider = new CSharpCodeProvider();
            CodeNamespace codeNamespace = new CodeNamespace(Namespace);
            using (TextWriter textWriter = new StreamWriter(Path.ChangeExtension(path, ".Designer.cs"), false, Encoding.Default))
            {
                System.Data.Design.TypedDataSetGenerator.Generate(dataSet, codeNamespace, codeDomProvider);
                codeDomProvider.GenerateCodeFromNamespace(codeNamespace, textWriter, null);
            }
            dataSet.WriteXmlSchema(Path.ChangeExtension(path, ".xsd"));
        }
        ///<summary>
        /// Génére un DataSet typé
        ///</summary>
        ///<param name="dataSet">DataSet contenant les DataTables,DataColumns,.. devant etre converti en DataSet typé</param>
        ///<param name="path">Chenim de sortie ou doit etre généré le DataSet typé</param>
        ///<param name="Namespace">Namespace à affecter au DataSet créé</param>
        public void GenerateTypedDataSet(DataSet dataSet, string path, string Namespace)
        {
            CodeDomProvider codeDomProvider = new CSharpCodeProvider();
            CodeNamespace codeNamespace = new CodeNamespace(Namespace);
            using (TextWriter textWriter = new StreamWriter(Path.ChangeExtension(path,dataSet.DataSetName + ".Designer.cs"), false, Encoding.UTF8))
            {
                System.Data.Design.TypedDataSetGenerator.Generate(dataSet, codeNamespace, codeDomProvider);
                codeDomProvider.GenerateCodeFromNamespace(codeNamespace, textWriter, null);
            }
            dataSet.WriteXmlSchema(Path.ChangeExtension(path, dataSet.DataSetName + ".xsd"));
        }
 
 
Exemple d’utilisation :
-          soit on fournit le chemin vers le fichier xml qui sera lu puis converti
-          Soit on créé soi même un dataSet(non typé) avec columns,relations,etc. et on le passe en paramètre
Ici je passe un fichier xml à lire
       private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            if(openFileDialog.ShowDialog()==DialogResult.OK)
            {
                GenerateTypedDataSet(openFileDialog.FileName,"ContactNamespace");
            }
       
        }
 
 
II avec System.Data. TypedDataSetGenerator (obsolète)
 
L’utilisation est similaire, bien que cette classe soit declare obsolete
public void GenerateTypedDataSet(string path, string Namespace)
        {
            DataSet dataSet = new DataSet();
            dataSet.ReadXml(path);
            ICodeGenerator codeGenerator = new CSharpCodeProvider().CreateGenerator();
 
            CodeNamespace CodeNamespace = new CodeNamespace(Namespace);
            using (TextWriter textWriter = new StreamWriter(Path.ChangeExtension(path, ".Designer.cs"), false, Encoding.UTF8))
            {
                TypedDataSetGenerator.Generate(dataSet, CodeNamespace, codeGenerator);
                codeGenerator.GenerateCodeFromNamespace(CodeNamespace, textWriter, null);
            }
            dataSet.WriteXmlSchema(Path.ChangeExtension(path, ".xsd"));
 
        }


DataSetGenerator.JPG
Par Romagny13
Ecrire un commentaire - Voir les 0 commentaires - Recommander
SqlDependency –avec application windows form

L’intérêt de SqlDependency est de le coupler avec l’utilisation d’un cache :
-          On stocke des données en provenance d’une base SQL Server (avec une durée et une date d’expiration)
-          Le rôle de SqlDependency est de vider le cache en cas de modification en base de données (de façon à avoir toujours des données à jour)
Ici je ne montre pas le couplage avec un cache mais simplement l’utilisation de SqlDependency
public delegate void ChangedEventHandler();
 
public class ContactDAO
    {
        public event ChangedEventHandler Changed;
 
        private static string connectionString = "Server=.;Database=ContactDB;Integrated Security=SSPI";
        private SqlConnection sqlConnection = null;
 
        public ContactDAO()
        {
            SqlDependency.Stop(connectionString);
            SqlDependency.Start(connectionString);
            sqlConnection = new SqlConnection(connectionString);
        }
        ~ContactDAO()
        {
            SqlDependency.Stop(connectionString);
        }
        //
        public DataTable GetContacts()
        {
            try
            {
                DataTable dataTable = new DataTable();
 
                // IMPORTANT : spécifier le nom des colonnes (ne pas utiliser *)!!
                SqlCommand sqlCommand = new SqlCommand(@"SELECT ContactName FROM dbo.[Contact]", sqlConnection);
                sqlCommand.Notification = null;
 
                SqlDependency sqlDependency = new SqlDependency(sqlCommand);
                sqlDependency.OnChange += new OnChangeEventHandler(OnChanged);
 
                if (sqlConnection.State == ConnectionState.Closed)
                    sqlConnection.Open();
  
             // Autre point important : il faut obligatoirement exécuter la commande (du sqldependency)
                dataTable.Load(sqlCommand.ExecuteReader(CommandBehavior.CloseConnection));
                return dataTable;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        // evenement
        void OnChanged(object sender, SqlNotificationEventArgs e)
        {
            SqlDependency sqlDependency = sender as SqlDependency;
            sqlDependency.OnChange -= OnChanged;
 
            if (Changed != null)
                Changed();
       }
}
 
Code de la form
   ContactDAO contactDAO = new ContactDAO();
 
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                SqlClientPermission sqlClientPermission = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted);
                sqlClientPermission.Demand();
                contactDAO.Changed += new ChangedEventHandler(contactDAO_Changed);
                dataGridView1.DataSource = contactDAO.GetContacts();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        void contactDAO_Changed()
        {
            MessageBox.Show("données modifiées");
            // évite les opérations inter threads
            ISynchronizeInvoke iSynchronizeInvoke = (ISynchronizeInvoke)this;
            if (iSynchronizeInvoke.InvokeRequired)
            {
                ChangedEventHandler changed = new ChangedEventHandler(contactDAO_Changed);
                iSynchronizeInvoke.BeginInvoke(changed, null);
                return;
            }
            // rechargement
            dataGridView1.DataSource = contactDAO.GetContacts();
        }
A savoir :
Le fonctionnement de SqlDependency est un peu différent de SqlCacheDependency(ASP.NET)
> En effet pour le web,un trigger est créé sur les tables (par l’intermediaire de l’utilitaire aspnet_regsql.exe), ces triggers appelent à chaque ajout,modification,suppression une procédure stockée qui met à jour une table contenant le nom de la table ayant  été modifié,l’index (changeId) est alors incrémenté ce qui permettra de constater la modification des données lors de la « boucle » (ou timer) qui s’execute pour tester les modifications(on le constate très facilement avec Sql Server Profiler)
>avec SqlDependency un service et une queue sont générées automatiquement dès la création d’une dépendance
Avant
  sqldependency1.jpg
Après création d’une dépendance
sqldependency2.jpg
Par Romagny13
Ecrire un commentaire - Voir les 0 commentaires - Recommander
Types - Valeurs par défaut
 utilisation des Nullables ?
et correspondance Base de données /Business Objects

Le but de ce post est de savoir lorsque l’on a besoin d’avoir une variable devant pouvoir  accepter les valeurs Null
(je pense notamment aux applications accèdant à une base de données) .. Une notion trés importante et à ne pas négliger !!


1 - quand utiliser les Nullables ou non
2 - et quel test effectuer pour vérifier si la variable a une valeur 

I – Business Objects
les valeurs en commentaire à droite correspondent au valeurs par défaut observées
suite à la création d’une instance de la classe
TypeTest typeTest = new TypeTest();
 
public class TypeTest
    {
        // 1 Pour tout ces types si on desire qu'ils puissent etre null
        // utiliser les nullables
        // puis test HasValue
        public int TypeTestint;//0
        public Decimal TypeTestDecimal;//0
        public Byte TypeTestByte;//0
        public SByte TypeTestSByte;//0
        public Double TypeTestDouble;//0.0
        public Single TypeTestSingle;//0.0
        public DateTime TypeTestDateTimr;//01/01/0001 00:00:00
        public bool TypeTestbool;// false
        public Guid TypeTestGuid;//{00000000-0000-0000-0000-000000000000}
       
 
        // 2 ne pas utiliser les Nullables ici
        // mais faire un test !=null
        public Byte[] TypeTestBytes;//null
        public object TypeTestObject;//null
        public string TypeTeststring;//null
 
 
        public TypeTest()
        { }
    }
 
II - COMMUNICATION Base de données (DBNULL) et objets métiers /Business Objects
1 -préparation
A - Avec SQL Server – créons une table de test pour les valeurs NULL
create table TESTDBNULL
(
testint int null,
testBytes binary null,
teststring char(250) null,
testDecimal decimal null,
testDouble float null,
testSingle real null,
testobject sql_variant null,
testGuid uniqueidentifier null
)
 
B - classe correspondante BusinessObjects
On voit bien que j’utilise soit les Nullables selon (voir plus haut)
public class TESTDBNULL
      {
        private Nullable<int> _testint;
 
        public Nullable<int> testint
        {
            get { return _testint; }
           set { _testint = value; }
        }
 
        private Nullable<Decimal> _testDecimal;
 
        public Nullable<Decimal> testDecimal
        {
            get { return _testDecimal; }
            set { _testDecimal = value; }
        }
 
        private Nullable<Double> _testDouble;
 
        public Nullable<Double> testDouble
        {
            get { return _testDouble; }
            set { _testDouble = value; }
        }
 
        private Nullable<Single> _testSingle;
 
        public Nullable<Single> testSingle
        {
            get { return _testSingle; }
            set { _testSingle = value; }
        }
 
        private Nullable<Guid> _testGuid;
 
        public Nullable<Guid> testGuid
        {
            get { return _testGuid; }
            set { _testGuid = value; }
        }
 
        private Byte[] _testBytes;
 
        public Byte[] testBytes
        {
            get { return _testBytes; }
            set { _testBytes = value; }
        }
 
        private string _teststring;
 
        public string teststring
        {
            get { return _teststring; }
            set { _teststring = value; }
        }
 
        private object _testobject;
 
        public object testobject
        {
            get { return _testobject; }
            set { _testobject = value; }
        }
 
      
 
        public TESTDBNULL()
        { }
 
      }
 
2 Dans le sens LECTURE (SGBD > APPLICATION)
Il faut utiliser un test sur DBNull.Value si la colonne de la table concernée peut recevoir des valeurs NULL
DbDataReader oDbDataReader;
                        DbCommand oDbCommand = DbProviderHelper.CreateCommand("SELECT [testint],[testBytes],[teststring],[testDecimal],[testDouble],[testSingle],[testobject],[testGuid] FROM [TESTDBNULL]", DbProviderHelper.DbConnection,CommandType.Text);
                        oDbDataReader = DbProviderHelper.ExecuteReader(oDbCommand);
                        while (oDbDataReader.Read())
                        {
                             TESTDBNULL oTESTDBNULL = new TESTDBNULL();
                    //LECTURE
                    if (oDbDataReader["teststring"] != DBNull.Value)
                        oTESTDBNULL.teststring = Convert.ToString(oDbDataReader["teststring"]);
                    if (oDbDataReader["testint"] != DBNull.Value)
                        oTESTDBNULL.testint = Convert.ToInt32(oDbDataReader["testint"]);
                    if (oDbDataReader["testBytes"] != DBNull.Value)
                        oTESTDBNULL.testBytes = (System.Byte[])(oDbDataReader["testBytes"]);
                    if (oDbDataReader["testDecimal"] != DBNull.Value)
                        oTESTDBNULL.testDecimal = Convert.ToDecimal(oDbDataReader["testDecimal"]);
                    if (oDbDataReader["testDouble"] != DBNull.Value)
                        oTESTDBNULL.testDouble = Convert.ToDouble(oDbDataReader["testDouble"]);
                    if (oDbDataReader["testSingle"] != DBNull.Value)
                        oTESTDBNULL.testSingle = Convert.ToSingle(oDbDataReader["testSingle"]);
                    if (oDbDataReader["testobject"] != DBNull.Value)
                        oTESTDBNULL.testobject = oDbDataReader["testobject"];
                    if (oDbDataReader["testGuid"] != DBNull.Value)
                        oTESTDBNULL.testGuid = (System.Guid)oDbDataReader["testGuid"];
                    lstTESTDBNULLs.Add(oTESTDBNULL);
                }
                        oDbDataReader.Close();
 
3 ECRITURE (APPLICATION > BASE DE DONNEES)
2 types de tests sur les variables pouvant accepter les valeurs NULL :
-          Soit la variable est un Nullable (int,Decimal …Guid voir plus haut)
-          Soit la variable peut avoir la valeur null (object,string,Byte[])
      DbCommand oDbCommand = DbProviderHelper.CreateCommand("INSERT INTO [TESTDBNULL]([testint],[testBytes],[teststring],[testDecimal],[testDouble],[testSingle],[testobject],[testGuid])VALUES(@testint,@testBytes,@teststring,@testDecimal,@testDouble,@testSingle,@testobject,@testGuid)", DbProviderHelper.DbConnection,CommandType.Text);
 
-                   // Soit la variable est un Nullable (int,Decimal …Guid voir plus haut)
               if (oTESTDBNULL.testint.HasValue)
                    oDbCommand.Parameters.Add(DbProviderHelper.CreateParameter("@testint", DbType.Int32, oTESTDBNULL.testint));
                        else
                    oDbCommand.Parameters.Add(DbProviderHelper.CreateParameter("@testint", DbType.Int32, DBNull.Value));
              
-                    // Soit la variable peut avoir la valeur null (object,string,Byte[])
                if (oTESTDBNULL.testBytes != null)
                    oDbCommand.Parameters.Add(DbProviderHelper.CreateParameter("@testBytes", DbType.Binary, oTESTDBNULL.testBytes));
                else
                    oDbCommand.Parameters.Add(DbProviderHelper.CreateParameter("@testBytes", DbType.Binary, DBNull.Value));
 
                        result = DbProviderHelper.ExecuteNonQuery(oDbCommand);
Par Romagny13
Ecrire un commentaire - Voir les 0 commentaires - Recommander
[ Cs2 Gen ]
générateur de code NTiers
(SQL Server 2000/2005/Express,Access 97-2007)

Je vous présente rapidement mon projet Cs2 Gen qui représente une solution simple,efficace et solide pour l’accès aux données
Le code est utilisable à partir de .NET 2.0 pour des applications desktop,web,wpf,etc.
Sont pris en charge :
- Génération couches BLL,BusinessObjects,DAL
- Caching
- Serialization Xml (reposant sur les generics)
- Classes d’aide pour les predicats des generics
- Le trie (IComparer)
- Génération des fichiers de configuration de l’application (App.config et Web.config) contenant les chaines de connexion
- Génération du script SQL (avec création des tables et procédures stockées/Views)
- Etc.

Ce projet est disponible sur CodePlex
http://www.codeplex.com/cs2gen
 
Cs2Gen-NTiers-generator.jpg
exemples de codes :
            BLLCtrl oBLLCtrl = new BLLCtrl();
            List<Contact> Contacts;
 
            // Get all
            Contacts = oBLLCtrl.ContactCtrl.GetContacts();
            dataGridView1.DataSource = Contacts;
 
            // get element(s) of relation
            List<Contact> result = oBLLCtrl.ContactCtrl.GetContactsOfCategory(1);
            Category category = oBLLCtrl.ContactCtrl.GetCategoryOfContact(contact);
 
            // filtre + trie sur la couche metier
            List<Contact> result = Contacts.FindAll(
                new PredicateBuilder<Contact>().MakePredicate(
                    PredicateExpression.StartsWith("Contactname", "A")
                    )
                );
            result.Sort(new Contact.ContactnameComparer(SorterMode.Ascending));
            dataGridView1.DataSource = result;
 
            // Add
            oBLLCtrl.ContactCtrl.AddContact(new Contact(4, "Dupond", 25, 1));
 
            // Update
            Contact result = Contacts.Find(new PredicateBuilder<Contact>().MakePredicate(
                PredicateExpression.Eq("ContactID", 4)
                  )
               );
            result.Contactname = "Lama";
            oBLLCtrl.ContactCtrl.UpdateContact(result);
 
            // Delete
            Contact result = Contacts.Find(new PredicateBuilder<Contact>().MakePredicate(
                PredicateExpression.Eq("ContactID", 4)
                  )
               );
            oBLLCtrl.ContactCtrl.RemoveContact(result);
 
            //Xml Serialization              
            oBLLCtrl.ContactCtrl.SerializeContacts(@"c:Contacts.xml", Contacts);
            List<Contact> result = oBLLCtrl.ContactCtrl.DeserializeContacts(@"c:Contacts.xml");
              
Par Romagny13
Ecrire un commentaire - Voir les 0 commentaires - Recommander
Typer les composants de la couche présentation

Lorsque l’on crée une application qui accède à une base de données, par exemple reposant sur une architecture NTiers(couche présentation + couche BLL + couche Business Objects + couche DAL)
Typer ses composants apporte souvent une facilité et une robustesse :
C'est-à-dire créer des composants (exemple : comboBox,DataGridView,la form en elle-même,etc.)
Dont la structure et les données est calquée sur la couche métier (Business Objects)
Ces composants disposeront des principales méthodes telles :
-          ajouter une liste/collection
-          ajouter un élément
-          modifier un élément
-          supprimer un élément
-          supprimer tous les éléments
-          mais également le support de undo/redo (annuler, rafraichir) peut être très intéressant
-          le copier/coller d’élément
-          etc.
Ecriture des items
en fait pour faire simple le composant reçoit des objets métiers (ex : liste générique de contacts, un contact, etc.) et « transforme » ces objets en items (exemple : ContactComboBoxItem)
Lecture des items
dans le sens inverse (Lecture items du composant), le composant renverra des objets métiers, on est alors vraiment très proche du DataBinding, sauf qu’ici on contrôle tout et la personnalisation peut être plus poussée
Exemple une comboBox affichant les Categories (de la base Northwind)
Points importants
-          créer une classe Item ayant les properties calqués sur la classe de la couche Business Objects correspondante
-          si on veut par exemple personnaliser la comboBox avec un affichage d’images ,définir le DrawMode sur DrawMode.OwnerDrawFixed, et redénir la méthode onDrawItem(),penser également à ajouter une imageList
 
    public partial class CategoriesComboBox : ComboBox
    {
        public CategoriesComboBox()
        {
            InitializeComponent();
 
            this.ImageList = imageList1;
        }
 
        public CategoriesComboBox(IContainer container)
        {
            container.Add(this);
 
            InitializeComponent();
 
            this.ImageList = imageList1;
 
       }
        // l'imaglist utilisée pour afficher les images dans la comboBox
        private ImageList ImageList;
 
        public void AddCategoriess(List<Categories> categoriess)
        {
            this.Items.Clear();
            foreach (Categories categories in categoriess)
                this.Items.Add(new CategoriesItem(categories));
            if (this.Items.Count > 0)
                this.SelectedIndex = 0;
        }
 
        public Categories GetCategories()
        {
            CategoriesItem categoriesItem = this.SelectedItem as CategoriesItem;
            return new Categories(categoriesItem.CategoryID, categoriesItem.CategoryName, categoriesItem.Description, categoriesItem.Picture);
        }
 
        protected override void OnDrawItem(System.Windows.Forms.DrawItemEventArgs e)
        {
            base.OnDrawItem(e);
 
            if (e.Index != -1)
            {
                CategoriesItem categoriesItem;
                Rectangle rectangle;
                Size size;
 
                rectangle = e.Bounds;
                size = ImageList.ImageSize;
 
                e.DrawBackground();
                e.DrawFocusRectangle();
 
                categoriesItem = (CategoriesItem)this.Items[e.Index];
 
                if (categoriesItem.ImageIndex != -1)
                {
                    ImageList.Draw(e.Graphics, rectangle.Left, rectangle.Top, categoriesItem.ImageIndex);
                    e.Graphics.DrawString(categoriesItem.ToString(), e.Font, new SolidBrush(e.ForeColor), rectangle.Left + size.Width, rectangle.Top);
                }
                else
                    e.Graphics.DrawString(categoriesItem.ToString(), e.Font, new SolidBrush(e.ForeColor), rectangle.Left, rectangle.Top);
            }
        }
    }
 
    public class CategoriesItem
    {
        private int _CategoryID;
 
        public int CategoryID
        {
            get { return _CategoryID; }
            set { _CategoryID = value; }
        }
 
        private string _CategoryName;
 
        public string CategoryName
        {
            get { return _CategoryName; }
            set { _CategoryName = value; }
        }
 
        private string _Description;
 
        public string Description
        {
            get { return _Description; }
            set { _Description = value; }
        }
 
        private Byte[] _Picture;
 
        public Byte[] Picture
        {
            get { return _Picture; }
            set { _Picture = value; }
        }
 
        // imageIndex de l'item
        private int _imageIndex;
 
        public int ImageIndex
        {
            get { return _imageIndex; }
            set { _imageIndex = value; }
        }
 
        public CategoriesItem()
            { }
 
        public CategoriesItem(Categories categories)
        {
            this.CategoryID = categories.CategoryID;
            this.CategoryName = categories.CategoryName;
            this.Description = categories.Description;
            this.Picture = categories.Picture;
            this.ImageIndex = 1;
        }
            // important !! c'est la valeur retournée qui sera affichée
        public override string ToString()
        {
            return CategoryName;
        }
    }
 
 
partial class CategoriesComboBox
    {
        ///<summary>
        /// Variable nécessaire au concepteur.
        ///</summary>
        private System.ComponentModel.IContainer components = null;
 
        ///<summary>
        /// Nettoyage des ressources utilisées.
        ///</summary>
        ///<param name="disposing">true si les ressources managées doivent être supprimées ; sinon, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
 
        #region Code généré par le Concepteur de composants
 
        ///<summary>
        /// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
        /// le contenu de cette méthode avec l'éditeur de code.
        ///</summary>
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CategoriesComboBox));
            this.imageList1 = new System.Windows.Forms.ImageList(this.components);
            this.SuspendLayout();
            //
            // imageList1
            //
            this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
            this.imageList1.TransparentColor = System.Drawing.Color.Fuchsia;
            this.imageList1.Images.SetKeyName(0, "VSObject_Map_Protected.bmp");
            //
            // CategoriesComboBox
            //
            this.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
            this.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
            this.ResumeLayout(false);
 
        }
 
        #endregion
 
        private System.Windows.Forms.ImageList imageList1;
    }


composants-types-copie-1.JPG

Par Romagny13
Ecrire un commentaire - Voir les 0 commentaires - Recommander

Persistent DataSet

même si je ne suis pas trop adepte du DataSet(qui selon moi ne peut etre applicable qu'à un petit projet entre autres)

Persistent DataSet est une solution qui peut être interessante, génération de tout le code d'accès aux données, bases supportées sur SQL Server,Oracle,PostgreSQL,système de requetage,etc.

la solution s'integre à Visual Studio 2005, il suffit alors d'ajouter un nouvel élément de type PersistentLayer, puis aller dans les propriétés et générer gràce à la barre d'outil persistent dataset (à afficher)

voila un lien vers un bon tutorial sur Developpez.com 
http://morpheus.developpez.com/persistentdatasets/

http://www.lastcomponent.com/index.php?page=downloads/main&left=left


moi ce qui m'interesse le plus c'est la mise en place d'un systeme de requetage ressemblant un peu à Linq (en "décompilé") que je vais étudié

PersitentDataset.JPG
Par Romagny13
Ecrire un commentaire - Voir les 0 commentaires - Recommander
Insérer une image ou lire une image d’une base de données
 
C’est quelque chose qui est souvent demandé comment lire une image d’une base de données ou comment en insérer une voila deux petites fonctions utilitaires qui va faciliter la vie
 
public byte[] ConvertImageTobyte(string path)
        {
            byte[] result = null;
            using (FileStream oFileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
                result = new byte[oFileStream.Length];
                oFileStream.Read(result, 0, (int)oFileStream.Length);
            }
 
            return result;
        }
        private Bitmap ConvertbyteToImage(byte[] ImageBuffer)
        {
            Bitmap result = null;
            using (MemoryStream oMemoryStream = new MemoryStream(ImageBuffer, true))
            {
                oMemoryStream.Write(ImageBuffer, 0, ImageBuffer.Length);
                result = new Bitmap(oMemoryStream);
            }
            return result;
        }
 
Utilisation (j’utilise ici DbProvider qui permet un accès générique aux bases de données)
-          Le type de données en direction de la base est :
DbType.Binary (utilisation de DbProvider)
SqlDbType.Image (SQL Server avec SqlClient)
OleDbType.LongVarBinary (Access avec OleDb)
-          Pour la couche métier ce sera un type byte[]
            // from file to DB
            // oDbCommand.Parameters.Add(DbProviderHelper.CreateParameter("Photo", DbType.Binary, oImageTable.Photo));
            OpenFileDialog oOpenFileDialog = new OpenFileDialog();
            if (oOpenFileDialog.ShowDialog() == DialogResult.OK)
            {
                oBLLCtrl.ImageTableCtrl.AddImageTable(new ImageTable(1, ConvertImageTobyte(oOpenFileDialog.FileName)));
            }
 
            //from DB to picturebox
            //oImageTable.Photo est de type byte[]
            ImageTable oImageTable = oBLLCtrl.ImageTableCtrl.GetImageTable(1);
            pictureBox1.Image = ConvertbyteToImage(oImageTable.Photo);
 
Par Romagny13
Ecrire un commentaire - Voir les 0 commentaires - Recommander
Attaquer une base MySQL avec System.Data.Common.DbProviderFactory
Sortons un peu des sentiers battus
MySQL est une base de données extrêment utilisée et dispose de qualités même si l’on est loin d’une base comme SQL Server ou même Access
Pour travailler en .NET avec une base MySQL plusieurs solutions sont possibles,ce que je propose ici c’est d’attaquer la base avec une classe d’accès générique aux données avec DbProviderFactory,
avec cette même classe on peut aussi bien attaquer une base Oracle que SQL Sever,Access,etc.,
j’utilises MySQL 5.0 + le connecteur ODBC MyODBC 3.51(téléchargeables sur le site http://www.mysql.com/)
En fait la seule chose qui différencie lorsque l’on travaille avec une base Access,MySQL,SQL Server,etc. :
-          Le provider
-          La chaine de connexion
-          Les requêtes (exemple pour SQL Server on mettra @nomparametre, alors que pour MySQL ou Access on mettra un point d’interrogation ?)
-          Les paramètres
Le petit script de création de la base MySQL (à saisir dans le Query Browser de MySQL)
create database contactsdb;
use contactsdb;
create table Contact
(
ContactID int not null primary key AUTO_INCREMENT,
ContactName char(150) not null,
ContactFirstName char(150) not null,
ContactAge int null,
ContactCategory char(50) not null
);
create table ContactCategory
(
ContactCategory char(50) not null primary key
);
 
ALTER TABLE contactsdb.contact ADD CONSTRAINT FK_contact_ContactCategory FOREIGN KEY FK_contact_ContactCategory (ContactCategory)
REFERENCES contactcategory (ContactCategory);
 
INSERT INTO ContactCategory(ContactCategory)
VALUES('Famille');
INSERT INTO ContactCategory(ContactCategory)
VALUES('Amis');
INSERT INTO ContactCategory(ContactCategory)
VALUES('Travail');
INSERT INTO ContactCategory(ContactCategory)
VALUES('autres');
 
Code de la form (4 opérations de base : consultation,ajout,modification ,suppression)
Cs2DbProvider.DbProviderUtilities DbProviderUtilities;
        System.Data.Common.DbConnection oDbConnection;
 
        private void Form1_Load(object sender, EventArgs e)
        {
            DbProviderUtilities = new Cs2DbProvider.DbProviderUtilities();
            oDbConnection = DbProviderUtilities.CreateConnection("System.Data.Odbc", "Driver={MySQL ODBC 3.51 Driver};Server=localhost;Database=contactsdb");
        }
        private void button1_Click(object sender, EventArgs e)
        {
            //MessageBox.Show(InsertCategory("nouveau").ToString());
          // MessageBox.Show(UpdateCategory("nouveau","changement du nom de category").ToString());
            MessageBox.Show(RemoveCategory("changement du nom de category").ToString());
 
            GetContactCategories();
        }
 
        public void GetContactCategories()
        {
            DataSet oDataSet = DbProviderUtilities.FillDataSet(DbProviderUtilities.CreateCommand(oDbConnection, "select * from ContactCategory", CommandType.Text));
            dataGridView1.DataSource = oDataSet.Tables[0];
        }
        public int InsertCategory(string Category)
        {
 
            System.Data.Common.DbCommand oDbCommand = DbProviderUtilities.CreateCommand(oDbConnection,"insert into ContactCategory(ContactCategory) values(?)", CommandType.Text);
            oDbCommand.Parameters.Add(DbProviderUtilities.CreateParameter("Category", DbType.String, Category));
            int result = DbProviderUtilities.ExecuteNonQuery(oDbCommand);
 
            return result;
        }
        public int UpdateCategory(string Category,string NewCategory)
        {
 
            System.Data.Common.DbCommand oDbCommand = DbProviderUtilities.CreateCommand(oDbConnection, "update ContactCategory set ContactCategory=? where ContactCategory=?", CommandType.Text);
            oDbCommand.Parameters.Add(DbProviderUtilities.CreateParameter("NewCategory", DbType.String, NewCategory));
            oDbCommand.Parameters.Add(DbProviderUtilities.CreateParameter("Category", DbType.String, Category));
            int result = DbProviderUtilities.ExecuteNonQuery(oDbCommand);
 
            return result;
        }
        public int RemoveCategory(string Category)
        {
            System.Data.Common.DbCommand oDbCommand = DbProviderUtilities.CreateCommand(oDbConnection, "delete from ContactCategory where ContactCategory=?", CommandType.Text);
            oDbCommand.Parameters.Add(DbProviderUtilities.CreateParameter("Category", DbType.String, Category));
            int result = DbProviderUtilities.ExecuteNonQuery(oDbCommand);
 
            return result;
        }

Vous pouvez trouver ma classe d'accès générique reposant sur System.Data.Common la >
http://www.csharpfr.com/codes/SYSTEM-DATA-COMMON-DBPROVIDERFACTORY-ACCES-GENERIQUE-BASES-DONNEES_40973.aspx

vous pouvez également télécharger cette source qui contient un visualizer de base de données qui vous permettra d'observer les meta données de n'importe quelle base (MySQL,Access,etc.)
http://www.csharpfr.com/codes/NET2CSSQL-OUTIL-MANAGEMENT-BASES-DONNEES-ACCESS-SQL-SERVER_39559.aspx
Par Romagny13
Ecrire un commentaire - Voir les 0 commentaires - Recommander
2 petites classes de gestion de cache
 
I – valable uniquement à partir .NET 2.0
///<summary>
    /// Classe de gestion du cache tirant parti des generics du Framework .NET 2.0
    ///</summary>
    ///<typeparam name="K">Type de la clé</typeparam>
   ///<typeparam name="T">Type de l'objet inséré</typeparam>
    public class CacheManager<K, T>
    {
        ///<summary>
        /// Le cache
        ///</summary>
        public static Dictionary<K, T> Cache;
 
        ///<summary>
        /// Constructeur static
        ///</summary>
        static CacheManager()
        {
            Cache = new Dictionary<K, T>();
        }
 
        ///<summary>
        /// Récupère l'objet en cache
        ///</summary>
        ///<param name="Key">Clé</param>
        ///<returns>L'objet correspondant à la clé</returns>
        public static T GetDataFromCache(K Key)
        {
            if (Cache.ContainsKey(Key))
                return Cache[Key];
            else
                return default(T);
        }
        ///<summary>
        /// Ajoute un objet au cache
        ///</summary>
        ///<param name="Key">Clé</param>
        ///<param name="obj">Objet ajoué</param>
        public static void Add(K Key, T obj)
        {
            if (Cache.ContainsKey(Key))
                Cache[Key] = obj;
            else
                Cache.Add(Key, obj);
        }
        ///<summary>
        /// supprime l'objet du cache
        ///</summary>
        ///<param name="Key">Clé permettant de trouver l'objet à supprimer dans le cache</param>
        public static void Remove(K Key)
        {
            if (Cache.ContainsKey(Key))
                Cache.Remove(Key);
        }
        ///<summary>
        /// Renseigne si l'objet est en cache
        ///</summary>
        ///<param name="Key">Clé de l'objet recherché</param>
        ///<returns>si l'objet correspondant à la clé est ou non en cache</returns>
        public static bool isInCache(K Key)
        {
            return Cache.ContainsKey(Key);
        }
        ///<summary>
        /// Compte le nombre d'objets en cache
        ///</summary>
        ///<returns></returns>
        public static int Count()
        {
            return Cache.Count;
        }
    }
 
Ex utilisation :
            List<Contact> cs = CacheManager<string, List<Contact>>.GetDataFromCache("1");
            if (cs != null)
            {
                dataGridView1.DataSource = cs;
            }
            else
            {
                List<Contact> oContacts = new List<Contact>();
                oContacts.Add(new Contact(1, "Romagny", "Jérôme", null));
                oContacts.Add(new Contact(3, "Martin", "Paul", 35));
                oContacts.Add(new Contact(4, "Bairant", "André", 40));
                CacheManager<string, List<Contact>>.Add("1", oContacts);
                dataGridView1.DataSource = oContacts;
            }
 
 
II – Classe valable pour .NET 1.0 et .NET 2.0
///<summary>
    /// Classe de gestion de cache pour le Framework .NET 1.0 ou supérieur
    ///</summary>
    public class CacheManager
    {
        ///<summary>
        /// Le cache
        ///</summary>
        public static System.Collections.Hashtable Cache;
 
        ///<summary>
        /// Constructeur static
        ///</summary>
        static CacheManager()
        {
            Cache = new System.Collections.Hashtable();
        }
 
        ///<summary>
        /// Récupère l'objet en cache
        ///</summary>
        ///<param name="Key">Clé</param>
        ///<returns>L'objet correspondant à la clé</returns>
        public static object GetDataFromCache(string Key)
        {
            if (Cache.ContainsKey(Key))
                return Cache[Key];
            else
                return null;
        }
        ///<summary>
        /// Ajoute un objet au cache
        ///</summary>
        ///<param name="Key">Clé</param>
        ///<param name="obj">Objet ajoué</param>
        public static void Add(string Key, object obj)
        {
            if (Cache.ContainsKey(Key))
                Cache[Key] = obj;
            else
                Cache.Add(Key, obj);
        }
        ///<summary>
        /// supprime l'objet du cache
        ///</summary>
        ///<param name="Key">Clé permettant de trouver l'objet à supprimer dans le cache</param>
        public static void Remove(string Key)
        {
            if (Cache.ContainsKey(Key))
                Cache.Remove(Key);
        }
        ///<summary>
        /// Renseigne si l'objet est en cache
        ///</summary>
        ///<param name="Key">Clé de l'objet recherché</param>
        ///<returns>si l'objet correspondant à la clé est ou non en cache</returns>
        public static bool isInCache(string Key)
        {
            return Cache.ContainsKey(Key);
        }
        ///<summary>
        /// Compte le nombre d'objets en cache
        ///</summary>
        ///<returns></returns>
        public static int Count()
        {
            return Cache.Count;
        }
    }
 
Ex utilisation :
List<Contact> cs =(List<Contact>) CacheManager.GetDataFromCache("1");
            if (cs != null)
            {
                dataGridView1.DataSource = cs;
            }
            else
            {
                // TRAVAIL AVEC UNE CLASSE COLLECTION
                List<Contact> oContacts = new List<Contact>();
                oContacts.Add(new Contact(1, "Romagny", "Jérôme", null));
                oContacts.Add(new Contact(3, "Martin", "Paul", 35));
                oContacts.Add(new Contact(4, "Bairant", "André", 40));
                CacheManager.Add("1", oContacts);
                dataGridView1.DataSource = oContacts;
            }
 
 
Par Romagny13
Ecrire un commentaire - Voir les 0 commentaires - Recommander
Se connecter à un classeur Excel 2007 (*.xlsx) via ADO.NET
La chaine de connexion a la forme :
-          Provider=Microsoft.ACE.OLEDB.12.0;
-          Data Source=chemin complet vers le fichier Excel
-          Extended Properties=""Excel 12.0;HDR=YES;"""
private void button2_Click(object sender, EventArgs e)
        {
            System.Data.DataTable oDataTable = new DataTable();
            System.Data.OleDb.OleDbDataAdapter oOleDbDataAdapter = new System.Data.OleDb.OleDbDataAdapter();
            oOleDbDataAdapter.SelectCommand = new System.Data.OleDb.OleDbCommand();
            oOleDbDataAdapter.SelectCommand.Connection = new System.Data.OleDb.OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;
Data Source=C:Documents and SettingsromagnyMes documentsDIVERS.xlsx;Extended Properties=""Excel 12.0;HDR=YES;""");
            oOleDbDataAdapter.SelectCommand.CommandType = CommandType.Text;
            oOleDbDataAdapter.SelectCommand.CommandText = "SELECT [ContactID],[ContactName],[ContactFirstName],[ContactEmail],[ContactCategoryID] FROM [Contact$]";
 
            oOleDbDataAdapter.Fill(oDataTable);
 
            dataGridView1.DataSource = oDataTable;
        }

http://www.connectionstrings.com/default.aspx?carrier=excel2007
Par Romagny13
Ecrire un commentaire - Voir les 0 commentaires - Recommander
Enterprise Library 3.1 May 2007 

nouvelle release sur codeplex

http://www.codeplex.com/entlib/Release/ProjectReleases.aspx?ReleaseId=4474
Par Romagny13
Ecrire un commentaire - Voir les 0 commentaires - Recommander

Compléments d'exploration de données Microsoft SQL Server 2005 pour Microsoft Office 2007

http://www.microsoft.com/downloads/details.aspx?familyid=7c76e8df-8674-4c3b-a99b-55b17f3c4c51&displaylang=fr

 

Par Romagny13
Ecrire un commentaire - Voir les 0 commentaires - Recommander

Creating and Using a DataTableReader 

http://msdn2.microsoft.com/en-us/library/ws7ad65f.aspx

Par Romagny13
Ecrire un commentaire - Voir les 0 commentaires - Recommander
Consulter une ligne
        public BObject.CONTACT ReadDataGridViewRow(int nRowIndex)
        {
            BObject.CONTACT oCONTACT;
            oCONTACT = new BObject.CONTACT();
 
            oCONTACT.code_contact = Convert.ToInt32(dataGridView1[0, nRowIndex].Value);
            oCONTACT.nom_contact = Convert.ToString(dataGridView1[1, nRowIndex].Value);
            oCONTACT.prenom_contact = Convert.ToString(dataGridView1[2, nRowIndex].Value);
            oCONTACT.photo_contact = Convert.ToString(dataGridView1[3, nRowIndex].Value);
            oCONTACT.code_type_contact = Convert.ToInt32(dataGridView1[3, nRowIndex].Value);
            oCONTACT.code_genre_contact = Convert.ToInt32(dataGridView1[4, nRowIndex].Value);
            oCONTACT.date_naissance_contact = Convert.ToDateTime(dataGridView1[5, nRowIndex].Value);
 
            return oCONTACT;
        }       
public BObject.CONTACT ReadDataGridViewRow()
        {
            BObject.CONTACT oCONTACT;
            oCONTACT = new BObject.CONTACT();
           
            int nRowIndex = dataGridView1.CurrentRow.Index;
            oCONTACT.code_contact = Convert.ToInt32(dataGridView1[0, nRowIndex].Value);
            oCONTACT.nom_contact = Convert.ToString(dataGridView1[1, nRowIndex].Value);
            oCONTACT.prenom_contact = Convert.ToString(dataGridView1[2, nRowIndex].Value);
            oCONTACT.photo_contact = Convert.ToString(dataGridView1[3, nRowIndex].Value);
            oCONTACT.code_type_contact = Convert.ToInt32(dataGridView1[3, nRowIndex].Value);
            oCONTACT.code_genre_contact = Convert.ToInt32(dataGridView1[4, nRowIndex].Value);
            oCONTACT.date_naissance_contact = Convert.ToDateTime(dataGridView1[5, nRowIndex].Value);
 
            return oCONTACT;
        }
 
Détail
Remplir et sélectionner une DatagridViewComboBoxCell
ex : on affiche la liste des  « libelle genre contact » des genres contacts et on sélectionne le « libelle genre » correspond au « code genre » du contact
 
            DataGridViewComboBoxCell oDataGridViewCellcode_genre_contact;
 
            oDataGridViewCellcode_genre_contact = new DataGridViewComboBoxCell();
 
 
// 1 remplir la liste
            foreach (BObject.GENRE_CONTACT oGENRE_CONTACTRow in oGENRE_CONTACT.BObjectGENRE_CONTACTs)
            {
                oDataGridViewCellcode_genre_contact.Items.Add(oGENRE_CONTACTRow.libelle_genre_contact);
            }
            // 2 Selection de la ligne
            foreach (BObject.GENRE_CONTACT oGENRE_CONTACTRow in oGENRE_CONTACT.BObjectGENRE_CONTACTs)
            {
                if (oGENRE_CONTACTRow.code_genre_contact == oContactRow.code_genre_contact)
                {
                    oDataGridViewCellcode_genre_contact.Value = oGENRE_CONTACTRow.libelle_genre_contact;
                }
            }
 
            if (oContactRow.date_naissance_contact != null)
            {
                oDataGridViewCelldate_naissance_contact.Value = oContactRow.date_naissance_contact.ToString();
            }
 
Par Romagny13
Ecrire un commentaire - Voir les 0 commentaires - Recommander
Créer un blog sur over-blog.com - Contact - C.G.U. - Rémunération en droits d'auteur - Signaler un abus