SqlParameter.Add() vs AddWithValue()

Posted in C#, SQL Server on Juni 21st, 2010 by Andreas Schwarz

Der Großteil der Entwickler wird sich bei Datenbankabfragen sicher mit der Methode AddWithValue() angefreundet haben.

Man gibt nur noch den Namen des Sql-Parameters und den entsprechenden Wert an und das .Net Framework kümmert sich um den Rest.

using (var conn = new SqlConnection(@"ConnectionString zensiert"))
{
     conn.Open();

     string sql = "Select LastName FROM TestTable WHERE LastName = @l";

     var cmd = new SqlCommand(sql, conn);

      cmd.Parameters.AddWithValue("@l", "Harglgargl");
       //selbes Ergebnis
       //cmd.Parameters.Add("@l", "Meier");

       object res = cmd.ExecuteScalar();
}

Ich würde erwarten, dass der SQL-Server schlau genug wäre und den Parameter korrekt auflöst.

Leider gibt es hier ein kleines Problem.

Führt man das Codefragment mit den Werten “Huber”, “Schmidt”, und “Harglgargl” aus würde man erwarten,

dass der SQL-Server einen bereits vorhandenen Ausführungsplan benutzt bzw. einen Plan für diese Abfrage erstellt und dann wiederverwendet.

Das Resultat sieht leider etwas anders aus:

Cached Plans

Für jede Varchar-Länge wird ein eigener Ausführungsplan angelegt.

Die Auswirkungen werden bei einem genaueren Blick auf die Speicherausnutzung des SQL-Servers deutlich.

Mein Dev-Server sagt dazu auf jeden Fall Folgendes:

Cached: verwendeter Speicher um Seiten zu cachen

Stolen: Speicher der “gestohlen” wird um Ausführungspläne zu cachen

Das Verhältnis wird in den meisten Szenarien vernachlässigbar sein. Ich kann mir allerdings einige Umgebungen vorstellen in denen das Ganze zum Problem werden könnte.

Wie dem auch sei. Je mehr Speicher zur Verfügung steht um Seiten zu cachen umso besser :)

Die Lösung des Ganzen ist aktuell leider etwas umständlich. Man kann das Ganze umgehen indem man den Datentyp der entsprechenden Datenbankspalte angibt.

Leider ist das Ganze extrem lästig da es aktuell keine brauchbare Überladung gibt (Man kann sich natürlich eine schnitzen)…

using (var conn = new SqlConnection(@"ConnectionString zensiert"))
{
     conn.Open();

     string sql = "Select LastName FROM TestTable WHERE LastName = @l";

     var cmd = new SqlCommand(sql, conn);

     SqlParameter p = new SqlParameter("@l", System.Data.SqlDbType.VarChar, 1000);
     p.Value = "Huber";

     cmd.Parameters.Add(p);

     object res = cmd.ExecuteScalar();
}

 

Tags: , , ,

Custom WCF Username/Password Validator mit wsHttpBinding

Posted in Allgemein, C# on April 16th, 2010 by Andreas Schwarz
...
namespace WCFTestService.Auth
{
    public class CustomUserNamePasswordValidator : UserNamePasswordValidator
    {
        public override void Validate(string userName, string password)
        {
               // check credentials here...
...

Config:


...
    
      
        
          ...
          

              
            
            
          
        
      
    
    
      
        
          
            
            
          
          ...
      
    
    
      
        
      
    
    ...

Tags: , ,

Webservice Traces mit WSE 2.0

Posted in C# on Oktober 30th, 2009 by Andreas Schwarz

WSE 2.0 Trace Sample

Auch wenn in der Webservice-Entwicklung mittlerweile größtenteils das WCF-Framework eingesetzt wird, haben wir alle bestimmt noch die eine oder andere “ältere” Anwendung zu betreuen.

Tritt ein Bug auf, schadet es nie zuerst einen Blick auf die entsprechenden Daten zu werfen. Während das Ganze im WCF-Framework mit einigen Mausklicks erledigt ist oder man nicht sowieso ein asychrones Traceing aufgesetzt hat ist bei den Web Service Enhancements ein wenig mehr zu tun.

Das Ganze ist allerdings mit Vorsicht zu genießen und sollte auf Produktiv-Systemen relativ zügig wieder deaktiviert werden da die entsprechenden Dateien relativ schnell anwachsen…

- Referenz auf die entsprechende WSE Assembly einfügen

- Die Vererbung der generierten Client-Klasse anpassen

Reference.cs

public partial class GlobalWeather : Microsoft.Web.Services2.WebServicesClientProtocol

 - App.config der Anwendung erweitern

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
 ...
      <section name="microsoft.web.services2" type="Microsoft.Web.Services2.Configuration.WebServicesConfiguration, Microsoft.Web.Services2, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    </configSections>
 ...
  <microsoft.web.services2>
    <diagnostics>
      <trace enabled="true"
        input="inputTrace.webinfo"
        output="outputTrace.webinfo"/>
    </diagnostics>
  </microsoft.web.services2>
</configuration>
Tags: , , ,