Posts
265
Comments
80
Trackbacks
4
September 2008 Entries
Fun mit SQL

Beim Erstellen eine Selects hatte ich vorhin festgestellt, dass die WHERE-Bedingung NOT IN () nicht sicher funktioniert, wenn das Ergebnis des Select in der Klammer auch NULL-Werte enthält.

Der erste Select liefert kein Ergebnis (obwohl es eines liefern müsste):

SELECT * FROM Locator WHERE
AKTIVBIS>=GETDATE()
 AND GUID NOT IN (SELECT LocatorGuid FROM DevProjectLocation)

Wird der Subselect in der Klammer nun auf Werte eingeschränkt, die nicht NULL sind (WHERE LocatorGuid IS NOT NULL) dann liefert der gesamte Select das gewünschte und tatsächliche Ergebnis:

SELECT * FROM Locator WHERE
AKTIVBIS>=GETDATE()
 AND GUID NOT IN (SELECT LocatorGuid FROM DevProjectLocation WHERE LocatorGuid IS NOT NULL)

posted @ Tuesday, September 23, 2008 12:13 PM | Feedback (1)
Bücher bei Google durchstöbern

Heute habe ich mal wieder die Buchsuche bei Google (http://books.google.de/) angesehen. Diese Suche ist ganz praktisch wenn man sich die Inhalte einiger Bücher ansehen oder sich über ein Thema informieren möchte. Wenn man z.B. ASP.NET eingibt, werden etliche Bücher ausgegeben die eine eingeschränkte Vorschau  bieten und in die man dann online einsehen kann.

posted @ Tuesday, September 16, 2008 10:20 AM | Feedback (0)
C# Code in VB.NET Code übersetzen

Unter der folgenden Adresse kann man online C# Code in VB.NET Code und umgekehrt übersetzen lassen: http://labs.developerfusion.co.uk/convert/csharp-to-vb.aspx

posted @ Wednesday, September 10, 2008 10:02 AM | Feedback (0)
So ein Zufall

Eben recherchierte ich mal nach Webseiten die meinem Namen (Christian Kiefer) enthalten und stoße hierbei auf die Seite http://www.christiankiefer.info/ meines Namensvetters.  Er ist "... ist ein Grenzgänger zwischen den musikalischen Welten, der es wie kein anderer versteht, das immense Panorama der Gitarrenmusik zu beleuchten."

Ich spiele auch Gitarre (derzeit vor allem Flamenco) wahrscheinlich nicht so virtuos wie mein Namensvetter, dafür kann ich aber besser programmieren  ;-)

posted @ Saturday, September 06, 2008 7:10 PM | Feedback (0)
Performance Vorteile bei der Verwendung von StringBuilder

Wenn man in einem Programm mehrere Strings miteinander verketten muss ist die Verwendung der Klasse StringBuilder anzuraten.

Der Performance Vorteil des StringBuilder-Objektes gegenüber einem String-Objektes liegt darin begründet, dass bei einem String-Verkettungsvorgang immer wieder neuer Speicher zugeordnet wird, während bei einem StringBuilder-Verkettungsvorgang nur Speicher zugeordnet wird, wenn der StringBuilder-Objektpuffer zu klein für die Aufnahme der neuen Daten ist.

Man kann daher die Performance des des StringBuilder-Objektes noch erhöhen, indem man dem Konstruktor die zu erwartende Puffergöße vorgibt:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BSP
{
    partial class StringVergleich
    {
        public static void TestStringbuilder()
        {

            DateTime dStart;
            String sOutput = string.Empty;
            String sAnhang = "GanzLaaaangeeeeerBeispieeeeelStriiiiiinng";
            int iAnzahl = 200000;

            // Test I - Test mit normaler Stringverkettung '+='
            dStart = DateTime.Now;
            for (int i = 0; i < iAnzahl; i++)
            {
                sOutput += sAnhang;
            }
            Console.WriteLine("Benötigte Zeit mit String-Operator '+=': " +
                DateTime.Now.Subtract(dStart).TotalMilliseconds);

            // Test II - Test mit Stringbuilder
            dStart = DateTime.Now;
            StringBuilder strB = new StringBuilder();
            for (int i = 0; i < iAnzahl; i++)
            {
                strB.Append(sAnhang);
            }
            sOutput = strB.ToString();
            Console.WriteLine("Benötigte Zeit mit StringBuilder I: " +
                DateTime.Now.Subtract(dStart).TotalMilliseconds);

            // Test III - Test mit Stringbuilder und vorgegebener Puffergröße
            dStart = DateTime.Now;
            StringBuilder strB2 = new StringBuilder(iAnzahl*sAnhang.Length);
            for (int i = 0; i < iAnzahl; i++)
            {
                strB2.Append(sAnhang);
            }
            sOutput = strB2.ToString();
            Console.WriteLine("Benötigte Zeit mit StringBuilder II: " +
                DateTime.Now.Subtract(dStart).TotalMilliseconds);

        }
    }
}

 
Obiges Programm liefert folgendes Ergebnis:

Benötigte Zeit mit String-Operator '+=': 546,2304
Benötigte Zeit mit StringBuilder I: 30,0432
Benötigte Zeit mit StringBuilder II: 10,0144

posted @ Saturday, September 06, 2008 4:18 PM | Feedback (1)
Exceldateien mit C# erstellen

Hier ein Beispiel wie man mit C# und der Microsoft-Office-API Excel fernsteuern und so eine Exceldatei erstellen kann.

Hierzu muss auf dem Rechner Microsoft-Office installiert sein, dann lässt sich im Visual-Studio Projekt einen COM Verweis auf "Microsoft Excel 11.0 Object Libary" setzen und so die Excel API in das Projekt einbinden.

Der Namespace muss noch in die eingebunden werden, hierbei empfiehlt es sich für den Namespace "Microsoft.Office.Interop.Excel" einen anderen Namen zu verwenden, damit mehrdeutige Objektverweise vermieden werden.

using Excel = Microsoft.Office.Interop.Excel;

So kommt z.B. das Objekt "Application" sowohl im Namespace "Microsoft.Office.Interop.Excel" als auch im Namespace "System.Windows.Forms" vor, zudem macht es den Quellcode lesbarer.

Das folgende Beispiel öffnet Excel, erstellt ein Workbook, gibt Werte ein und erstellt anschließend eine Grafik und fügt diese in die Exceldatei ein und schließt Excel wieder: 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;

namespace ExcelBeispiel
{

  public partial class Form1 : Form
  {

     public Form1()
    {
        InitializeComponent();
    }

     private void buttonCreateExcelFile_Click(object sender, EventArgs e)
    {
      // Variablen deklarieren 
      Excel.Application myExcelApplication;
      Excel.Workbook myExcelWorkbook;
      Excel.Worksheet myExcelWorkSheet;
      myExcelApplication = null;

       try
      {
        // First Contact: Excel Prozess initialisieren
        myExcelApplication = new Excel.Application();
        myExcelApplication.Visible = true;
        myExcelApplication.ScreenUpdating = true;

        // Excel Datei anlegen: Workbook
        var myCount = myExcelApplication.Workbooks.Count;
        myExcelWorkbook = (Excel.Workbook)(myExcelApplication.Workbooks.Add(System.Reflection.Missing.Value));
        myExcelWorkSheet = (Excel.Worksheet)myExcelWorkbook.ActiveSheet;

        // Überschriften eingeben
        myExcelWorkSheet.Cells[2, 2] = "Hamburg";    // Zelle B2
        myExcelWorkSheet.Cells[2, 3] = "Nürnberg";   // Zelle C2
        myExcelWorkSheet.Cells[2, 4] = "Hamburg";    // Zelle D2

        // Formatieren der Überschrift
        Excel.Range myRangeHeadline;
        myRangeHeadline = myExcelWorkSheet.get_Range("B2", "D2");
        myRangeHeadline.Font.Bold = true;
        myRangeHeadline.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
        myRangeHeadline.Borders.Weight = Excel.XlBorderWeight.xlThick;

        // Daten eingeben
        myExcelWorkSheet.Cells[3, 2] = "18";

        myExcelWorkSheet.Cells[3, 3] = "21";
        myExcelWorkSheet.Cells[3, 4] = "11";
        myExcelWorkSheet.Cells[4, 2] = "21";
        myExcelWorkSheet.Cells[4, 3] = "32";
        myExcelWorkSheet.Cells[4, 4] = "22";
        myExcelWorkSheet.Cells[5, 2] = "12";
        myExcelWorkSheet.Cells[5, 3] = "56";
        myExcelWorkSheet.Cells[5, 4] = "14";
        myExcelWorkSheet.Name = "Kunden";


        // Chart erzeugen
        Excel.Range myRangeValues;
        myRangeValues = myExcelWorkSheet.get_Range("B3", "D5");

        Excel.Chart myChart = (Excel.Chart)myExcelWorkbook.Charts.Add(
          System.Reflection.Missing.Value,
          System.Reflection.Missing.Value,
          System.Reflection.Missing.Value,
          System.Reflection.Missing.Value);

        myChart.ChartWizard(
          myRangeValues,
          Excel.XlChartType.xl3DColumn,
          System.Reflection.Missing.Value,
          Excel.XlRowCol.xlRows,
          System.Reflection.Missing.Value,
          System.Reflection.Missing.Value,
          System.Reflection.Missing.Value,
          "Titel",
          "Kunden",
          "Anzahl",
          System.Reflection.Missing.Value);

         myChart.CopyPicture(Excel.XlPictureAppearance.xlScreen,
          Excel.XlCopyPictureFormat.xlBitmap,
          Excel.XlPictureAppearance.xlScreen);

         myChart.Location(Excel.XlChartLocation.xlLocationAsObject,myExcelWorkSheet.Name);

        // Excel Datei abspeichern
        // wenn die Datei vorher vorhanden ist, kommt in Excel eine Fehlermeldung.
        myExcelWorkbook.Close(true, "C:\\kunden.xls", System.Reflection.Missing.Value);
      }

      catch (Exception ex)
      {
        String myErrorString = ex.Message;
        MessageBox.Show(myErrorString);
      }
      finally

      {
        // Excel beenden
        if (myExcelApplication != null)
        {
          myExcelApplication.Quit();
        }

      }  

    }  

  }  

}

posted @ Friday, September 05, 2008 11:00 AM | Feedback (3)
Google's Browser Chrome

Natürlich habe ich mir heute auch den neuen Browser Chrome von Google installiert. Den Download findet man hier: http://www.google.com/chrome.

google

Was mir nach dem ersten Testen aufgefallen ist:

  • Chrome ist tatsächlich schneller als Internet Explorer, sowohl beim Start als auch beim Seitenaufbau.
  • bei der Installation werden die Favoriten vom Internet Explorer automatisch importiert, allerdings in alphabetischer Reihenfolge und nicht in der Reihenfolge wie sie im Internet Explorer sortiert waren.
  • es gibt die Funktion "Link im Inkognito-Fenster öffnen". Dies ermöglicht ein privates surfen, d.h. die besuchten Seiten werden nicht im Browserverlauf angezeigt.
  • Tabs lassen sich aus dem Fenster ziehen um diese als neues Browserfenster zu öffnen. Tabs lassen sich auch von einem Browserfenster in das andere Browserfenster verschieben.
  • Unter Werkzeug und Optionen lässt sich einstellen welche Seiten (auch mehrere) beim Start von Chrome geladen werden sollen.
  • Auf der rechten Seite des Browserfensters wird kein Platz für den Scrollbalken freigehalten, d.h. dass das zentrierte Layout einer Homepage nach links springt wenn auf einer Seite ein Scrollbalken angezeigt werden muss.
  • Ein auf einer Seite per Javascript geöffnetes Popup-Fenster erscheint nicht geöffnet sindern unten im Browser als Tab welches geöffnet werden muss
posted @ Wednesday, September 03, 2008 7:48 AM | Feedback (2)
Neuerungen in C# 3.0 / Visual Studio 2008

Ich habe hier mal die Neuerungen in C# 3.0 / Visual Studio 2008 zusammengefasst:

Automatic properties:
Nach der Deklaration der Variablen kann man im Kontextmenü "Umgestalten | Feld kapseln> auswählen um sich die Property-Definitionen generieren zu lassen:

automaticProperties

 
IntelliSense-Trick:
Manchmal überdeckt die IntelliSense-Liste einen Teil des Quellcodes dessen Informationen man jetzt eigentlich benötigt. Durch Gedrückthalten der Strg-Taste wird diese List unsichtbar gemacht. Nach Loslassen der Strg-taste wird die Liste wieder sichtbar.

Using-Direktiven organisieren:
Über das Kontextmenü stehen jetzt unter "Using-Direktiven organisieren" Funktionen zur Verfügung die Namespace zu sortieren und/oder nicht benötigte Namespaces zu entfernen.

usings

 
Object- und Collection-Initialiser:
Bei der Initialisierung einer Klasse ist es nun möglich die Werte der Variablen zu übergeben. Dazu werden die runden Klammern durch geschweifte Klammern ersetzt, dies wird von IntelliSense natürlich unterstützt.

objektInitialiser

 
Partielle Methoden:
Partiellen Klassen können nun partielle Methoden hinzugefügt werden. Der Vorteil ist, dass die partiellen Methode bereits Teil der Klasse ist und verwendet werden kann, jedoch erst später (in einer anderen partiellen Klasse) Code zu dieser partiellen Methode hinzugefügt werden kann.

partielleMethoden

posted @ Monday, September 01, 2008 8:13 AM | Feedback (0)