Fehlermeldung mit „perf-ReportServer-rsctr.dll“ beim Update von Microsoft SQL Server 2008 R2

Beim Update von Microsoft SQL Server 2008 R2 kam während des Setuplaufs folgender Fehler:

Der Prozess kann nicht auf die Datei „C:\WINDOWS\system32\perf-ReportServer-rsctr.dll“ zugreifen, da sie von einem anderen Prozess verwendet wird.

TITEL: Microsoft SQL Server 2008 R2-Setup
——————————

Fehler:

Der Prozess kann nicht auf die Datei „C:\WINDOWS\system32\perf-ReportServer-rsctr.dll“ zugreifen, da sie von einem anderen Prozess verwendet wird.

Klicken Sie auf ‚Wiederholen‘, um die fehlgeschlagene Aktion zu wiederholen, oder auf ‚Abbrechen‘, um diese Aktion abzubrechen und Setup fortzusetzen.

Hilfe erhalten Sie durch Klicken auf: http://go.microsoft.com/fwlink?LinkID=20476&ProdName=Microsoft+SQL+Server&EvtSrc=setup.rll&EvtID=50000&ProdVer=10.50.1600.1&EvtType=0x24776C0D

——————————
SCHALTFLÄCHEN:

&Wiederholen
Abbrechen
——————————

Ursache

Die Ursache war dann nach langem Recherchieren trivial: Es lief Process Explorer von SysInternals, der die DLL gesperrt hatte.

Lösung

Die Lösung ist ebenso trivial gewesen: Ich habe Process Explorer dann komplett abgeschossen und konnte das Setup erfolgreich abschließen.

Praxistipps für den Umgang mit einem Content Management System (CMS)

Auf der Website für unseren Hompage-Generator Zeta Producer habe ich vor einiger Zeit versucht, ganz viele nützliche Tipps aufzuschreiben, unabhängig von unserem Produkt, für den Umgang mit einer Website und allem was dazu gehört:

CMS-Praxistipps für Einsteiger

CMS-Praxistipps für Profis

Häufige Fragen

Ggf. ist das ja für den einen oder anderen nützlich.

Mantis Bug Tracker

Eine Software die wir schon seit mehreren Jahren verwenden um Fehlerberichte zu erfassen ist die Open-Source-Software namens Mantis Bug Tracker, kurz MantisBT oder Mantis genannt.

Bildschirmfoto von Mantis Bugtracker

Seinerzeit hat unser damaliger Auszubildender Rainer (heute selbstständig mit eigener Firma) die Software eingeführt und konfiguriert.

Mit Mantis ist es möglich, komplett Web basiert Fehler und Feature-Requests zu erfassen, zu verwalten und zu dokumentieren.

Wir verwenden das bei quasi allen internen Projekten um Fehler („Bugs“) und Featurewünsche („Feature Requests“) zu protokollieren, außerdem setzen wir es auch bei Kundenprojekten ein.

Zunächst ist es für den Kunden oft lästig, gefundene Issues und Wünsche anstatt per Telefon oder E-Mail, über den Bugtracker zu erfassen und zwar so, dass sie auch gut vorqualifiziert sind; nach einer Weile sind fast alle Kunden zufrieden, weil sie durch die Verwendung einer Fehlerdatenbank auch für sich Vorteile haben:

  • Alle berichteten Fehler sind für immer dokumentiert. Das hilft beim späteren Nachvollziehen.
  • Änderungen (z.B. Fehler wurde vom Entwickler beseitigt) werden in Mantis ebenfalls protokolliert und dokumentiert; der Kunde wird hierdurch automatisch per E-Mail benachrichtigt, also aktiv informiert, ohne dass er etwas machen muss.

In unserem Test-Management-System Zeta Test gibt es ebenfalls eine Schnittstelle zu Mantis (neben OnTime, Bugzilla und anderen Bugtrackern), Tester können so automatisch fehlgeschlagene Tests als Bugs berichten, diese werden dann in Mantis automatisiert angelegt.

Fazit

Mantis Bugtracker

Mantis ist kostenlos und flexibel. Die Benutzeroberfläche würde ich als tendenziell „hässlich“ oder „unübersichtlich“ bezeichnen, die Features machen das wiederum deutlich wett.

Falls Ihr also auf der Suche nach einem Fehler-Tracking-System seid, schaut Euch Mantis mal an.

Repair broken TortoiseSVN Explorer Overlay Icons on Windows 7 64-bit

Symptom

The cute litte Windows Explorer Shell Overlay Icons of TortoiseSVN (you know those red, green, blue, etc. icons) that indicate the SVN state of your files or folders are missing.

Your are using a 64-bit version of Microsoft Windows 7.

Cause

The 64-bit versions of Windows 7 can only handle a total of 15 overlay icon handler.

Resolution

The resolution to edit the registry, as described in this article on Stack Overflow did not work on my machine.

What actually helped was that I updated to the latest version of TortoiseSVN and then used Autoruns from Sysinternals to remove all the Shell overlay icon identifiers except those of TortoiseSVN:

In my case there were lots of those ugly Groove entries (installed by Microsoft Office 2010) and some Dropbox entries.

After unchecking and rebooting my machine, the TortoiseSVN icons appeared again.

You can get Autoruns directly from the URL http://live.sysinternals.com/autoruns.exe without the need to install anything.

Zone-30-Geschwindigkeitsmessung

Juhu!

Nach nur einem knappen Jahr, hat die Polizei bzw. die Stadt Göppingen so eine mobile Geschwindigkeits-Messanlage bei uns im Stauferpark montiert:

Ich hatte seinerzeit angefragt, was ich tun könne, damit die Leute hier im Stauferpark Göppingen neben unserem Büro nicht so durch die Straßen rasen; ich war in (berechtigter) Sorge um die Gesundheit meines Hundes.

Diese Messung war wohl das einzig Machbare.

Kollege Mario hat erzählt, dass er die Montage mitbekommen hat („…die zwei dümmsten Bauhof-Mitarbeiter die ich je gesehen habe…“); scheinbar sind die ohne Rücksicht auf (vorhandene) Fußgänger im ersten Gang auf und abgerast um zu testen ob das Gerät auch ordentlich misst.

Mal gucken ob das Gerät nun ein Bisschen hilft und zur Langsamkeit motiviert.

Verhalten von BOF und EOF in ADO

Zurzeit habe ich die Aufgabe ein Microsoft-Access-VBScript-Projekt in eine moderne Ajax-ASP.NET-4.0-C#-Anwendung zu migrieren.

Dabei stoße ich auf zahlreiche „seltsame“ Sachen die mit VBScript so möglich sind.

Recordset.BOF und Recordset.EOF

Eines davon ist die Logik der Eigenschaften „BOF“ und „EOF“ eines Recordsets.

Laut Dokumentation gilt:

BOF: Indicates that the current record position is before the first record in a Recordset object.
EOF: Indicates that the current record position is after the last record in a Recordset object.

Der Programmcode durch den ich mich arbeite verwendet die BOF-Eigenschaft häufig zum Prüfen ob Datensätze vorhanden sind oder nicht.

Selbsttest

Leider widersprechen sich Programmlogik und Kommentare manchmal, deshalb habe ich eine kleine Access-Datenbank mit einem Modul erstellt, das die verschiedenen Fälle durchspielt.

Das Ergebnis ist wie folgt:

=========================
Test-Beginn

—————
SQL-Abfrage die einen Datensatz liefert (Count: 1)
BOF: Falsch
EOF: Falsch

—————
SQL-Abfrage die mehrere Datensätze liefert (Count: 2)
BOF: Falsch
EOF: Falsch

—————
SQL-Abfrage die keine Datensätze liefert (Count: 0)
BOF: Wahr
EOF: Wahr

Test-Ende
=========================

D.h. sobald ein Datensatz vorhanden ist, sind sowohl BOF als auch EOF „false“, sonst jeweils „true“.

Somit bedeuten folgende Prüfungen:

If Recordset.BOF = False then –> Daten sind vorhanden
If Recordset.BOF = True then –> Daten sind nicht vorhanden

Download

Damit Ihr es bei Interesse selbst mal ausprobieren könnt, gibt es hier die Access-Datei zum Download.

NullReferenceException beim DataBind in ASPxGridView

Heute habe ich nach ein paar Änderungen an einem funktionierenden ASPxGridView-Steuerelement auf einmal folgende Fehlermeldung erhalten, sobald der Anwender auf einen Hyperlink im Grid oder zum Sortieren auf eine Spalte geklickt hatte:

Object reference not set to an instance of an object.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:
Line 65: <dxgv:GridViewDataColumn Caption=“Actions“ VisibleIndex=“4″>
Line 66: <DataItemTemplate>
Line 67: <asp:LinkButton runat=“server“ Visible='<%#Eval(„CanContinue“)%>‘ OnCommand=“GridLinkButton_Click“ CommandArgument='<%# Eval(„ID“) %>‘ CommandName=“Continue“ Text=“Continue“ />
Line 68: <asp:LinkButton runat=“server“ Visible='<%#Eval(„CanFinish“)%>‘ OnClientClick=“javascript:return confirm(‚Do you really want to finish this test run?‘);“ OnCommand=“GridLinkButton_Click“ CommandArgument='<%# Eval(„ID“) %>‘ CommandName=“Finish“ Text=“Finish“ />
Line 69: <asp:LinkButton runat=“server“ Visible='<%#Eval(„CanDetails“)%>‘ OnCommand=“GridLinkButton_Click“ CommandArgument='<%# Eval(„ID“) %>‘ CommandName=“Details“ Text=“Details“ />

Source File: c:\Users\ukeim\Documents\Visual Studio 2010\Projects\Zeta Test\Zeta Test Main\Source\WebMain\UI\TestPlansAndRuns\TestRuns\CurrentTestRuns.aspx Line: 67

Stack Trace:

[NullReferenceException: Object reference not set to an instance of an object.]
ASP.ui_testplansandruns_testruns_currenttestruns_aspx.__DataBinding__control25(Object sender, EventArgs e) in c:\Users\ukeim\Documents\Visual Studio 2010\Projects\Zeta Test\Zeta Test Main\Source\WebMain\UI\TestPlansAndRuns\TestRuns\CurrentTestRuns.aspx:67
System.Web.UI.Control.OnDataBinding(EventArgs e) +91
System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +92
System.Web.UI.Control.DataBind() +15
System.Web.UI.Control.DataBindChildren() +201
System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +101
DevExpress.Web.ASPxGridView.GridViewBaseTemplateContainer.DataBind() +20
DevExpress.Web.ASPxGridView.Rendering.ASPxGridViewRenderHelper.AddTemplateToControl(Control destination, ITemplate template, Control templateContainer, TemplateContainerCollection collection, Boolean doDataBinding) +194
DevExpress.Web.ASPxGridView.Rendering.ASPxGridViewRenderHelper.AddDataItemTemplateControl(Int32 visibleIndex, GridViewDataColumn column, Control templateContainer) +211
DevExpress.Web.ASPxGridView.Rendering.GridViewTableDataCell.CreateControlHierarchy() +109
DevExpress.Web.ASPxClasses.Internal.InternalTableCell.CreateChildControls() +24
System.Web.UI.Control.EnsureChildControls() +102
DevExpress.Web.ASPxClasses.Internal.InternalTableCell.DevExpress.Web.ASPxClasses.Internal.IASPxWebControl.EnsureChildControls() +10
DevExpress.Web.ASPxClasses.ASPxWebControlBase.EnsureChildControlsRecursive(Control control, Boolean skipContentContainers) +138
DevExpress.Web.ASPxClasses.ASPxWebControlBase.EnsureChildControlsRecursive(Control control, Boolean skipContentContainers) +156
DevExpress.Web.ASPxClasses.ASPxWebControlBase.EnsureChildControlsRecursive(Control control, Boolean skipContentContainers) +156
DevExpress.Web.ASPxClasses.ASPxWebControlBase.EnsureChildControlsRecursive(Control control) +40
DevExpress.Web.ASPxClasses.ASPxWebControlBase.CreateChildControls() +49
System.Web.UI.Control.EnsureChildControls() +102
DevExpress.Web.ASPxClasses.ASPxWebControlBase.EnsureChildControls() +4
DevExpress.Web.ASPxClasses.ASPxWebControlBase.DevExpress.Web.ASPxClasses.Internal.IASPxWebControl.EnsureChildControls() +10
DevExpress.Web.ASPxClasses.ASPxWebControlBase.EnsureChildControlsRecursive(Control control, Boolean skipContentContainers) +138
DevExpress.Web.ASPxClasses.ASPxWebControlBase.EnsureChildControlsRecursive(Control control, Boolean skipContentContainers) +156
DevExpress.Web.ASPxClasses.ASPxWebControlBase.EnsureChildControlsRecursive(Control control, Boolean skipContentContainers) +156
DevExpress.Web.ASPxClasses.ASPxWebControlBase.EnsureChildControlsRecursive(Control control, Boolean skipContentContainers) +156
DevExpress.Web.ASPxClasses.ASPxWebControlBase.EnsureChildControlsRecursive(Control control) +40
DevExpress.Web.ASPxClasses.ASPxWebControlBase.CreateChildControls() +49
DevExpress.Web.ASPxClasses.ASPxWebControl.CreateChildControls() +142
System.Web.UI.Control.EnsureChildControls() +102
DevExpress.Web.ASPxClasses.ASPxWebControlBase.EnsureChildControls() +4
DevExpress.Web.ASPxClasses.ASPxWebControlBase.get_Controls() +21
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +24
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +225
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +148
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +225
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +148
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +225
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +148
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +225
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +148
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +225
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +148
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +225
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +148
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +225
System.Web.UI.Page.LoadAllState() +312
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +747

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.1

Nachdem auf der Lauf im Debugger und „Bei Ausnahmen anhalten“ leider keine neuen Erkenntnisse gebracht hatten, bin ich durch diesen Artikel auf die Lösung gekommen:

Im Init-Ereignis des GridView-Steuerelements habe ich die Eigenschaft SettingsPager.PageSize gesetzt. Diese Zuweisung an die Eigenschaft hat die (indirekte) NullReferenceException ausgelöst.

Nachdem ich die Zuweisung entfernt hatte, lief alles wieder. Seltsam.

Doppelte Zeilen in Excel finden

Dieser Artikel ist primär als Erinnerung für mich selber gedacht.

Um in Microsoft Office Excel mehrfache (doppelte) Zeilen zu erkennen und markieren, gibt es folgende kleine Formel:

=WENN(ZÄHLENWENN(A$2:A2;A2)>1;“Doppelt“;““)

Dies einfach in die Spalte rechts daneben schreiben und mit der Maus dann den Bereich nach unten ziehen.

Beispiel

Um das zu verdeutlichen, hier eine kleine Tabelle (Download):

Bildschirmfoto einer Tabelle in Microsoft Office Excel 2010

Die Spalte „Doppelt?“ enthält überall dort Einträge „Doppelt“ wenn der Datensatz bereits vorhanden ist.

Diese Zeilen könntet Ihr dann z.B. löschen oder herausfiltern.

Alternative mit Excel 2010 und neuer (2013, 2016)

Unter Microsoft Office Excel 2010, 2013, 2016 und neuer gibt es die Option „Bedingte Formatierung“ und darin die Option „Regeln zum Hervorheben von Zellen“ sowie die untergeordnete Option „Doppelte Werte“.

Wenn Ihr zuvor eine ganze Spalte markiert und dann diese Bedingte Formatierung auf die Spalte anwendet, bekommt Ihr eine gleichwertige Lösung.

STUN – „Session Traversal Utilities for NAT“, TURN und ICE

Vor kurzem haben wir mit einem Kunden diskutiert wie denn Tools wie Skype oder TeamViewer auf Netzwerkebene funktionieren.

Nun, Skype artbeiten mit dem sogenannten „Session Traversal Utilities for NAT“ (STUN), ebenso wie Microsoft Windows Live Messenger; ich gehe davon aus, dass es TeamViewer ähnlich macht, ggf. noch ergänzt durch weitere ähnliche Protokolle/Verfahren.

Neben STUN erwähnt der Wikipedia-Artikel noch das verwandte Protokoll „Traversal Using Relay NAT“ (TURN) und die verwandte Technik „Interactive Connectivity Establishment“ (ICE).

Auch für Peer-to-Peer-Netzwerke (P2P) gibt es entsprechende Techniken wie z.B. „UDP Hole Punching“ oder „TCP Hole Punching“ um via NAT zu funktionieren.

Implementierungen

Alles eine spannende Sache, und inzwischen auch gut dokumentiert.

Ich selbst habe früher während des Studiums und der Diplomarbeit auch viel mit Sockets gearbeitet, kleine Übungs-Chats programmiert oder mal einen HTTP-Server. Natürlich nie über Firewalls und NAT hinweg, das war damals zum Glück nie nötig.

Zurück zum Thema.

Ich habe eine Weile rumgesucht, ob es Implementationen von STUN in .NET gibt. Tatsächlich gibt es ein paar davon, z.B. einen CodeProject-Artikel für einen STUN-Client und einen SIP-Stack-Artikel (VoIP) vom selben Autor.

STUN/TURN/ICE für Windows Communication Foundation (WCF)?

Was ich leider nicht gefunden habe ist eine Implementation von STUN, TURN oder ICE für Microsofts Windows Communication Foundation (WCF).

Ich bin noch recht neu mit WCF, denke aber dass es technisch schon möglich und vor allem sinnvoll ist, zusätzlich zu HTTP und Co. auch noch STUN als zuschaltbares Protokoll zur Verfügung zu haben.

Ggf. gibt’s da ja doch was?

Update 2011-04-23

Für HTTP habe ich was interessantes gefunden: „Comet“ als Überbegriff für verschiedenen Techniken im HTTP-Bereich um vom Server Benachrichtigungen zum Client zu senden. Namentlich z.B. auch „Ajax Push“ oder „HTTP Server Push“ genannt. Interessant! (Gibt’s auch für ASP.NET)