Overblog Suivre ce blog
Administration Créer mon blog

Présentation

  • : Romagny13 - Du .NET,du pur .NET
  • Romagny13 - Du .NET,du pur .NET
  • : Cycle de progression Faire (quelque chose qui marche) -> comprendre ce que l’on fait/comment cela marche -> pousser plus loin les notions
  • Contact

Recherche

Articles Récents

27 février 2014 4 27 /02 /février /2014 01:27

Ajouter une référence à System.Data.SqlServerCe.dll (C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v4.0\)

  • using System.Data.SqlServerCe;
  •        Passer la chaine de connexion dans le constructeur de SqlCeEngine ou la méthode Upgrade()
Exemple
           SqlCeEngine sqlCeEngine = new SqlCeEngine(@"Data Source=C:\Users\romagny\Documents\datas\Database.sdf;");
 
            try
            {
                sqlCeEngine.Upgrade();
                MessageBox.Show("Base de données mise à jour .");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

 

Repost 0
26 février 2014 3 26 /02 /février /2014 18:33

LightSwitch permet de créer rapidement des applications métiers centrées sur les données(RAD) .
 
1 – Création d’un projet LightSwitch

2 possibilités :
-          Application de bureau LightSwitch
-          Application HTML LightSwitch
Il sera possible de switch d'un type de projet à l'autre facilement depuis les propriétés du projet Client


   2 – Data Sources
On peut soit créer ses tables soit ajouter une source de données (base de données, SharePoint, Service OData,Service RIA WCF)

Soit depuis le designer soit depuis le menu contextuel (ajouter une table, ajouter une source de données) sur le dossier Data Sources du projet *.server


 
Exemple je me connecte à la base de données SQL Server Northwind et je sélectionne les tables Products et Categories

 
 

3 – Ajout d’écrans (« screens »)

Menu contextuel sur le dossier « screens » du projet client > Ajouter un écran .Plusieurs choix possibles :
Ecran grille modifiable
Ecran détails
Ecran liste et détails
Ecran de recherche de données
Nouvel écran de données

 

Exemple je crée un écran Liste et détails pour la table Products 

 

 Il est également possible de modifier la navigation d’écran, les propriétés du client (logo,thème,etc.), le type de client(web,desktop) depuis le menu contextuel « modifier la navigation »


4 – Exécution/Test

Selon le type de client, le projet s’affichera soit dans le navigateur soit dans une fenêtre.
Il est possible d’éditer la conception de l’écran depuis le menu « concevoir l’écran » même durant l’exécution.
Il est bien sur possible de trier, d’éditer, sauvegarder les données selon les fenêtres crées.
Le menu Tasks permet d’accéder aux différents écrans.
 
5-Créer ses écrans personnalisés
Exemple je crée un écran qui permet d’afficher les produits de la catégorie sélectionnée.
Je crée un écran de grille modifiable
Puis j’ajoute une grille de « Products »


Ressources
Repost 0
Published by Romagny13 - dans LightSwitch
commenter cet article
25 février 2014 2 25 /02 /février /2014 19:01

I - LINQ TO SQL - Mappage par attributs((System.Data.Linq.Mapping)

Attributs :Database,Table,Column,etc.

 

Quelques propriétés de l’attribut Column
[Table(Name = "Client")]
    public class Clients
    {
        [Column(IsPrimaryKey = true, IsDbGenerated = true)]
        public int Id { get; set; }
 
        [Column(CanBeNull = false)]
        public string Name { get; set; }
 
        [Column]
        public string Email { get; set; }
    }

DataContext

  public class DemoContext : DataContext

    {

        public Table<Clients> Clients { get { return this.GetTable<Clients>(); } }

 

        public DemoContext(string connectionString) : base(connectionString) { }

    }                     

 Note : LINQ TO SQL > DataContext, EDM > ObjectContext
 
Validation avec IDataErrorInfo(exemple en vb) http://blogs.msdn.com/b/bethmassi/archive/2008/02/25/simple-validation-with-linq-to-sql-classes.aspx

De LINQ To SQL à LINQ To XML
DemoContext db = new DemoContext(@"Data Source=.\SQLEXPRESS;Initial Catalog=dbDemo;Integrated Security=SSPI;");
 
        private void btnWriteXml_Click(object sender, RoutedEventArgs e)
        {
            XElement xml = new XElement("clients",
                       from c in db.Clients
                       orderby c.Name
                       select new XElement("client",
                              new XAttribute("Id", c.Id),
                              new XAttribute("Name", c.Name)  
                              )
                       );
            xml.Save(@"C:\Clients.xml");
        }

II - Ressources
Ecrire son propre provider LINQ
Exemples de providers : LINQ to Amazon ,  LINQ to Active Directory ,  LINQ to CRM ,  LINQ To Geo - Language Integrated Query for Geospatial Data ,  LINQ to Excel ,  LINQ to Google,  LINQ to JSON ,  LINQ to NHibernate ,  LINQ to JavaScript ,  LINQ to LLBLGen Pro ,LINQ to Sharepoint ,  LINQ to Streams ,  LINQ to WMI,  etc.

 

Bonnes pratiques

Guidance explorer http://guidanceexplorer.codeplex.com/

Microsoft Application Architecture Guide http://msdn.microsoft.com/en-us/library/dd673617.aspx

Prism http://www.codeplex.com/CompositeWPF
MVVM LIGHT (Silverlight, WPF et Windows Phone) http://www.galasoft.ch/mvvm/

Développer en .NET sur Android et ios

MonoTouch http://xamarin.com/ios
MVVMCross(Mvvm Platform for Xamarin.iOS, Xamarin.Android, WindowsPhone, WindowsStore, WPF and Mac) https://github.com/MvvmCross/MvvmCross

Les modèles

MVC(Model View Controller) http://www.asp.net/mvc
MVP(Model View Presenter) http://jab.developpez.com/tutoriels/dotnet/mvppattern/

VP
MVVM(Model-View-VIewController) http://www.e-naxos.com/Blog/?tag=/mvvm
DAL + BOL + IHM (Data Access Layer,Business Object Layer,interface)
Repost 0
Published by Romagny13 - dans Linq To SQL
commenter cet article
18 février 2014 2 18 /02 /février /2014 00:14

 

"On code d’abord" et la base de données est générée ensuite par rapport à ce que l’on code.

Ressources
Intéressant MVC5 + OAuth et Windows Azure
Intallation du nuget Entity Framework
Quelques commandes(dans la console de gestion du package de visual Studio)
enable-migrations
add-migration Initial
Update-Database

 

Exemple
Je n’indique pas la base de données dans la chaine de connexion du fichier de configuration .Una base de données SQL Server va être générée  à l’éxécution de application .
-    le nom de la chaine de connexion est identique au datacontext(ClientContext ici)

La base générée : CodeFirstDemo.DAL.ClientContext

 

 

  <connectionStrings>
    <add name="ClientContext"
         connectionString="data source=.\SQLEXPRESS;integrated security=True;" providerName="System.Data.EntityClient" />
  </connectionStrings>

 

public class ClientContext : DbContext
    {
        public DbSet<Client> Clients { get; set; }
    }
    public class ClientProvider
    {
        ClientContext context = new ClientContext();
 
        public List<Client> GetAllClients()
        {
                return context.Clients.ToList();
        }
    }
public class Client
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Email { get; set; }
        public int CategoryId { get; set; }
    }

 

MainForm
  private void MainForm_Load(object sender, EventArgs e)
        {
            ClientProvider provider = new ClientProvider();
 
            dataGridView1.DataSource = provider.GetAllClients();
   
        }   

 

 

Repost 0
Published by Romagny13 - dans C
commenter cet article
17 février 2014 1 17 /02 /février /2014 21:03

ProfileCommon ne semble plus généré avec le Framework .NET 4.x .

1-HttpContext.Current.Profile
Exemple : je définis une propriété « Email » accessible aux utilisateurs anonymes
Web.config
<configuration>
  <system.web>
    <anonymousIdentification enabled="true" cookieless="AutoDetect"/>
    <profile enabled="true">
      <properties>
        <add name="Email" type="String" allowAnonymous="true"/>
      </properties>
    </profile>
  </system.web>
<!-- etc. -->
</configuration>

 

Ecriture
HttpContext.Current.Profile.SetPropertyValue("Email", "bellinmarie@live.com");
Lecture
HttpContext.Current.Profile.GetPropertyValue("Email").ToString();

 

2- Se créer sa propre classe ProfileCommon
On peut aussi se construire sa propre classe ProfileCommon, qui hérite de ProfileBase et permet d’accéder aux propriétés définies dans le fichier de configuration.
  public class ProfileCommon :ProfileBase
    {
        public ProfileCommon() { }
 
        private string _email;
 
        [SettingsAllowAnonymous(true)]
        public string Email
        {
            get { return HttpContext.Current.Profile.GetPropertyValue("Email").ToString(); }
            set { _email = value; }
        }
 
        public override void Save()
        {
            HttpContext.Current.Profile.SetPropertyValue("Email", _email);
        }
    }

Utilisation
ProfileCommon profile = new ProfileCommon();
TextBox1.Text = profile.Email;
profile.Email ="bellinmarie@live.com";
profile.Save();

 

« Microsoft.AspNet.Providers.Core 2.0.0 » depuis Visual Studio (menu contextuel > gérer les packages Nuget)

 

Documentation nuget       

Repost 0
Published by Romagny13 - dans ASP.NET
commenter cet article
17 février 2014 1 17 /02 /février /2014 17:43
1-Avoir sa base de données ASPNETDB.MDF
Au pire

2 -  Gérer la base avec l’outil d’administration
1 – invite de commande
"C:\Program Files\IIS Express\iisexpress.exe" /path:c:\windows\Microsoft.NET\Framework\v4.0.30319\ASP.NETWebAdminFiles /vpath:"/asp.netwebadminfiles" /port:8089 /clr:4.0 /ntlm  

2 – dans le navigateur
http://localhost:8089/asp.netwebadminfiles/default.aspx?applicationPhysicalPath=[apppath]\&applicationUrl=/

Remplacer [apppath] par le chemin complet vers le répertoire du site web .  
Exemple :
http://localhost:8089/asp.netwebadminfiles/default.aspx?applicationPhysicalPath=C:\Users\romagny\Documents\Visual Studio 2013\WebSites\ECommerceDemo\ECommerceDemo\&applicationUrl=/  

Repost 0
Published by Romagny13 - dans ASP.NET
commenter cet article
13 février 2014 4 13 /02 /février /2014 19:15

Xaml  


-          local correspond au namespace du projet (xmlns:local="clr-namespace:WpfDemoBinding")

Ressource (peut être définie pour la page, un conteneur ,un control)

  <Window.Resources>
        <local:Clients x:Key="clients"/>
    </Window.Resources>


Control

   <ListBox x:Name="lstClients" ItemsSource="{Binding Source={StaticResource clients}}"  >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">                       
                        <TextBlock Text="{Binding Name}" />
                        <TextBlock Text="{Binding Email}"  />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

 

C#
On créé une classe collection qui se charge depuis son constructeur
On pourrait tout aussi bien la charger depuis une base de données ou un fichier Xml
Pour bien faire il faudrait que la classe Client implémente INotifyPropertyChanged
public class Client
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Email { get; set; }
        public DateTime Birth { get; set; }
    }
    public class Clients : ObservableCollection<Client>
    {
        public Clients()
        {
            Add(new Client() { Name = "Bellin Marie", Email = "bellinmarie@live.com", Birth = new DateTime(1992,02,27) });
            Add(new Client() { Name = "Dupond Paul", Email = "dupondp123@yahoo.fr", Birth = new DateTime(1987, 01, 10) });
        }
    }

Cette manière de procéder permet de n’avoir aucun code behind dans la page.

Converter
Implémente IValueConverter
Value : valeur à convertir
[ValueConversion(typeof(DateTime), typeof(String))]
    public class DateConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return ((DateTime)value).ToShortDateString();
        }
 
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            DateTime result;
            if (DateTime.TryParse(value.ToString(), out result))
                return result;
            return DependencyProperty.UnsetValue;
        }
    }

Xaml
On rajoute une ressource
<Window.Resources>
...
        <local:DateConverter x:Key="dateConverter"/>
    </Window.Resources>

On rajoute un textBlock à la listBox
<TextBlock Text="{Binding Path=Birth, Converter={StaticResource dateConverter}}"/>

 
Repost 0
Published by Romagny13 - dans Xaml
commenter cet article
12 février 2014 3 12 /02 /février /2014 22:46

L’éditeur d’expressions personnalisées peut être une bonne aide pour définir ses liaisons de données facilement.

Exemple je vais définir l’ItemsSource de ma listBox avec l’éditeur

 

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
 
            Cities = new List<string>() { "Londres", "Munich", "Berlin", "Rome" };
        }
        public List<string> Cities { get; set; }    
    }

 

Dans le panneau propriétés de ma listBox

 

 
 
 
 
Le Xaml est mis à jour

<ListBox x:Name="lstCities" ItemsSource="{Binding Cities, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}}}" />

 
Repost 0
Published by Romagny13 - dans Xaml
commenter cet article
12 février 2014 3 12 /02 /février /2014 12:26

    Pour l’ajout et la modification :

  • [AcceptVerbs(HttpVerbs.Post)]
  • Vérification selon les contraintes, null, utilisation des expressions régulières pour vérifier le format (http://regexlib.com)
  • Si l’entrée n’est pas correcte on ajoute une erreur au ModelState :           ModelState.AddModelError("propriété", "texte à afficher à l’utilisateur");
  • On vérifie que le model ne contient pas d’erreur pour l’ajout en base de données  ModelState.IsValid  

 

Ajout
Je crée une méthode ValidateClient
        [AcceptVerbs(HttpVerbs.Post)]
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(Client client)
        {
            ValidateClient(client);
 
            if (ModelState.IsValid)
            {
                db.Clients.Add(client);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
 
            ViewBag.CategoryId = new SelectList(db.Categories, "Id", "Name", client.CategoryId);
            return View(client);
        }
        private void ValidateClient(Client client)
        {
            if (string.IsNullOrWhiteSpace(client.Name))
                ModelState.AddModelError("Name", "Nom requis.");
            if (!string.IsNullOrEmpty(client.Email))
                if (!Regex.IsMatch(client.Email, @"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$"))
                    ModelState.AddModelError("Email", "Email non valide."); 
        }

 

Modification (c’est la même chose)
    [AcceptVerbs(HttpVerbs.Post)]
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(Client client)
        {
            ValidateClient(client);
 
            if (ModelState.IsValid)
            {
                db.Entry(client).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.CategoryId = new SelectList(db.Categories, "Id", "Name", client.CategoryId);
            return View(client);
        }

 

Il est également possible de définir le message à afficher dans la vue.
Exemple
@Html.ValidationMessage("Name", "Veuilez entrer votre nom. ")



Modifier le style des erreurs

Il est possible de modifier le style des erreurs affichées dans le fichier css
/* styles for validation helpers */
.field-validation-error {
    color: #e80c4d;
    font-weight: bold;
}
 
.field-validation-valid {
    display: none;
}
 
input.input-validation-error {
    border: 1px solid #e80c4d;
}
 
input[type="checkbox"].input-validation-error {
    border: 0 none;
}
 
.validation-summary-errors {
    color: #e80c4d;
    font-weight: bold;
    font-size: 1.1em;
}
 
.validation-summary-valid {
    display: none;
}
 
Si on veut ajouter un ValidationSummary à la page :
@Html.ValidationSummary()
Validation par attribut
Exemple dans la classe Client générée avec ADO.NET Entity Data Model
[Required(ErrorMessage = "Catégorie requise")]
public int CategoryId { get; set; }

     
da1          
       
Repost 0
Published by Romagny13 - dans ASP.NET MVC
commenter cet article
10 février 2014 1 10 /02 /février /2014 17:07

Exemple : on essaie d’insérer deux nouvelles lignes dans la table Catégories de la base Northwind La  deuxième requête ne renseignant pas CategoryName (qui n’accepte pas les valeurs nulles), l’insertion sera annulée

public void DoTransaction()

        {

            using (SqlConnection connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=SSPI;"))

            {

                connection.Open();

                SqlTransaction transaction = connection.BeginTransaction();

                SqlCommand command = connection.CreateCommand();

                command.Transaction = transaction;

                try

                {

                    //      

                    command.CommandText = "INSERT INTO [dbo].[Categories]([CategoryName],[Description]) VALUES('Cakes','Good cakes .');";

                    command.ExecuteNonQuery();

                   

                    // CategoryName n'acceptant pas de valeur nulle ....  

                    command.CommandText = "INSERT INTO [dbo].[Categories]([Description]) VALUES('Category unnamed .');";

                    command.ExecuteNonQuery();

 

                    transaction.Commit();

                }

                catch (Exception Ex)

                {

                    transaction.Rollback();

                    MessageBox.Show(Ex.Message);

                }

            }

        }

 

transaction1.png 

 

IsolationLevel http://msdn.microsoft.com/fr-fr/library/system.transactions.isolationlevel(v=vs.110).aspx

 

Exemple IsolationLevel.Serializable : les données peuvent être lues mais pas modifiées pendant la transaction

SqlTransaction transaction = connection.BeginTransaction(IsolationLevel.Serializable);

 

 

TransactionScope

http://msdn.microsoft.com/fr-fr/library/system.transactions.transactionscope(v=vs.110).aspx

 

Repost 0
Published by Romagny13 - dans ADO.NET
commenter cet article