Julien Pinquié

ASP.NET, C#, SQL Server, Windows Live
Rechercher des tables et colonnes dans SQL Server

Aujourd’hui, j’ai dû mettre en place le suivi des modifications dans les tables d’une base de données SQL Server chez un client. La base de données fait plus de 140 tables, pour une quarantaine à suivre, et les champs sont déjà créés : l’astuce est donc de rechercher les tables auxquelles appartiennent les champs ModifiedOn ou ModifiedBy.

Je me suis basé sur les tables systèmes qui contiennent les objets de la base de données, par exemple :

  • sys.tables pour les tables,
  • syscolumns pour les colonnes,
  • sys.triggers pour les déclencheurs,
  • sys.default_constraints pour les contraintes, …

La requête ci-dessous devient évidente avec une jointure entre les tables sys.tables et syscolumns :

SELECT t.name FROM syscolumns AS c
INNER JOIN sys.tables AS t ON c.id = t.object_id
WHERE c.name = 'ModifiedOn'
ORDER BY t.name
Posted: Jun 19 2009, 05:46 PM by jpinquie | with no comments
Filed under: ,
Nouvelle version de CodeRush Xpress pour Visual Studio 2008

DevExpress

DevExpress a publié une nouvelle version de CodeRush Xpress pour C# et VB, contenant notamment plus une soixantaine d’outils intégrés à Visual Studio 2008 pour faciliter les refactorings.

CodeRush Xpress est disponible gratuitement pour tous les développeurs Visual Studio 2008, et offre une suite d'outils qui vous permettent ainsi qu'à votre équipe de simplifier et de mettre en forme du code complexe, le rendant plus facile à lire et moins coûteux à maintenir.

Parmi les fonctionnalités intéressantes, en voici quelques unes que j’ai pu tester :

  • Duplication des lignes
  • Fonctionnalités avancées avec le presse-papier
  • Navigation simplifiée (fenêtre ou fichier)
  • Suppression de code ou de paramètres inutilisés
  • Déplacement d'un type dans un fichier
  • Inversion des conditions

Toutes les fonctionnalités en détails ici.

Comportement du FileUpload dans un contrôle Ajax UpdatePanel

Il existe une subtilité dans l'utilisation d'un FileUpload placé dans un contrôle UpdatePanel. Pour des raisons de sécurité, la configuration suivante ne fonctionnera pas.

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
   <ContentTemplate>
      <asp:FileUpload ID="FileUpload1" runat="server" /> 
      <asp:Button ID="btnSend" runat="server" Text="Update"
           onclick="btnSend_Click" />
   </ContentTemplate>
</asp:UpdatePanel>

La propriété HasFile est égale à False.

if (FileUpload1.HasFile)
{
   ...
}

Le téléchargement de fichier nécessite un PostBack complet de la page, alors qu’un UpdatePanel fait ses requêtes de mise à jour partielle en utilisant l'objet XmlHttpRequest.

La solution consiste tout simplement à ajouter un PostBackTrigger sur le bouton qui exécute le téléchargement.

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    ...
   <Triggers
      <asp:PostBackTrigger ControlID="btnSend" /> 
   </Triggers>
</asp:UpdatePanel>

Posted: May 18 2009, 10:43 AM by jpinquie | with no comments
Filed under: ,
Kit de développement pour Microsoft SQL Server 2008

Microsoft vient tout juste de publier le SQL Server 2008 Developer Training Kit, qui fournit aux architectes et aux développeurs des informations sur les nouvelles fonctionnalités du serveur de base de données et leur utilisation.
Le kit de développement inclut 6 présentations Powerpoint, 12 scripts de démo et 3 ateliers Hands-on Labs sur les sujets suivants : les données spatiales, l'objet Filestream, l'intégration avec le CLR, Reporting Services, les types de date et heure, et les améliorations apportées à T-SQL.

Kit de développement pour Microsoft SQL Server 2008

Ce kit semble être assez complet, plus d’informations et téléchargement ici.

Erreur avec MSXML 6.0 lors de l'installation de SQL Server 2008

En essayant d'installer SQL Server Express 2008, j'ai rencontré une erreur inconnue lors de l'action Install_Msxml6_Cpu32_Action : SkipInstallNewerCA, ne récupérant aucune information exploitable dans les détails des erreurs de l'installation.

Install_Msxml6_Cpu32_Action : SkipInstallNewerCA

Il s'agit en fait d'un problème avec MSXML 6.0, qui n'arrive pas à se mettre à jour lorsqu'il est déjà installé sur le poste. La réinstallation manuelle ne résolvant pas le problème (dans mon cas), il faut supprimer la version de MSXML 6.0 (voir 4.0) présente avant de relancer l'installation complète de SQL Server 2008.

Pour information, le fichier de log Msxml6_Cpu32_1.log (dans le répertoire C:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\Log) fournit les indications suivantes :

Début de l'action 14:03:48 : SkipInstallNewerCA.
This package is not supported on this operating system.
Fin de l'action 14:03:48 : SkipInstallNewerCA. Valeur renvoyée : 3.
Fin de l'action 14:03:48 : INSTALL. Valeur renvoyée : 3.

MSI (s) (74:58) [14:03:48:892]: Produit : MSXML 6.0 Parser (KB933579) -- L'installation a échoué.
MSI (s) (74:58) [14:03:48:892]: Windows Installer a installé le produit. Nom du produit : MSXML 6.0 Parser (KB933579). Version du produit : 6.10.1200.0. Langue du produit : 1036. Réussite de l’installation ou état d’erreur : 1603.

D'après ce que j'ai pu trouver sur Internet, cette erreur peut apparaitre avec n'importe quelle version de SQL Server 2008.

Problème avec WebDev.Webserver.exe, IE ne peut pas afficher la page Web

Ce matin, j'ai décidé d'installer la nouvelle version de mon antivirus mais plus aucun moyen d'afficher les pages de mes projets Visual Studio 2005, que ce soit en mode Debug ou non, avec pour simple indication l'écran ci-dessous, "Internet Explorer ne peut pas afficher cette page Web" ("Internet Explorer cannot display the webpage").

image

C'est en exécutant la commande ping localhost que je me suis rendu compte que l'adresse correspondante était ::1, il s'agit là en fait de la représentation IPv6 de l'adresse locale et le serveur web intégré WebDev.WebServer.exe n'arrive pas à trouver l'adresse localhost dans cette configuration.

imageIl suffit de commenter la ligne faisant référence à ::1 dans le fichier hosts contenu dans le répertoire %windir%\System32\drivers\etc\.
Aucun redémarrage  n'est requis.

How to resolve "__doPostBack is not defined" error

It just happened to me... I put my script in an file and declare it in the header like this :

<script src="js/masterpage.js" type="text/javascript" />

When I launch the page, I get a javascript error __doPostBack is not defined and none of my javascript functions is executed.

It seems that some tags need a closing tag and don't understand "/>", it's the case of the script tag but not of link, used to call my css style sheets for example. Using this code works :

<script src="js/masterpage.js" type="text/javascript"></script>
How to get domain user information from Active Directory in C#

First, we have to know the user connection name (here from an ASP.NET page).

string principal = this.Context.User.Identity.Name;

 


Then we have to define some stuff :

  • search filter including object type and connection name,
  • domain,
  • properties to retrieve from Active Directory.
string filter = string.Format("(&(ObjectClass={0})(sAMAccountName={1}))", "person", principal);
string domain = "DOMAIN";
string[] properties = new string[] { "fullname" };

 


To search in Active Directory, we need the following objects :

  • DirectoryEntry : represents a node or object in the Active Directory hierarchy,
  • DirectorySearcher : performs queries against Active Directory Domain Services.
DirectoryEntry adRoot = new DirectoryEntry("LDAP://" + domain, null, null, AuthenticationTypes.Secure);
DirectorySearcher searcher = new DirectorySearcher(adRoot);
searcher.SearchScope = SearchScope.Subtree;
searcher.ReferralChasing = ReferralChasingOption.All;
searcher.PropertiesToLoad.AddRange(properties);
searcher.Filter = filter;
 
SearchResult result = searcher.FindOne();
DirectoryEntry directoryEntry = result.GetDirectoryEntry();

 


Finally, once information is retrieved in the DirectoryEntry object, we can get the details of each property defined.

string displayName = directoryEntry.Properties["displayName"][0].ToString();
string firstName = directoryEntry.Properties["givenName"][0].ToString();
string lastName = directoryEntry.Properties["sn"][0].ToString();
string email = directoryEntry.Properties["mail"][0].ToString();
Posted: Feb 06 2008, 12:07 PM by jpinquie | with 21 comment(s) |
Filed under: ,
More Posts