Skip to main content


Showing posts from 2011

nLog - Updating ExceptionLayoutRenderer to capture “Exception.Data”

Something that appears to be missing from many logging frameworks is the ability to log/report the “data” collection of any thrown exceptions. I originally encountered this issue with log4net, and have recently found nLog appears to be lacking the same desired functionality. As our current project looks like it will be switching to using nLog I’ve had a dig around in the source code to see how easily this functionality can be added.Basically for a quick and dirty solution the desired functionality can be added by adding the following function to the class “ExceptionLayoutRenderer”:private static void AppendData(StringBuilder sb, Exception ex) { var separator = string.Empty; foreach (var key in ex.Data.Keys) { sb.Append(separator); sb.AppendFormat("{0}: {1}", key, ex.Data[key]); separator = " "; } } And the referencing this new function inside the “switch” statement of “CompileFormat”:case"DATA": dataTargets.Add(AppendData); break; Finally to use this new functionality…

SQL Agent Immediately Stops

We just run into an interesting problem where starting the SQL Server Agent would start and then immediately stop. No errors were reported in the event log, but running the following via the command line returned "StartServiceCtrlDispatcher failed (error 6)"

"[[your SQL Path]]\Binn\SQLAGENT.EXE" -i [[sql Instance]]
Googling the error in question returned this forum post which contained the solution. We had reinstalled the service and the account that we were running under did not have the permissions to update / overwrite something (it wasn't the error file in question). Running the agent under a different account solved the issue; would be good to look into what the exact problem we are encountering is, but it's enough that it's running for us right now.

Exceptions inside IComparer.Compare(x, y)

When writing or using an implementation of IComparer.Compare(x,y) you encounter the following error message:

Unable to sort because the IComparer.Compare() method returns inconsistent results. Either a value does not compare equal to itself, or one value repeatedly compared to another value yields different results

It is highly likely that the code within the "Compare" statement is throwing an exception. We encountered this problem when trying to access an array out of bounds in a particular scenario. Updating our tests and our code to return a correct result in this scenario fixed the issue for us.

Unit Test Code Coverage

It seems that a common aim when first starting out in unit testing is to obtain 100% code coverage with our unit tests.  This single metric is the defining goal and once obtained a new piece of functionality is targeted.  After all if you have 100% code coverage you can’t get better than that, can you?It’s probably fair to say that it’s taken me several years and a few failed attempts at test driven development (TDD) to finally understand why when production code fails it can still occur in code that is “100%” covered by tests!  At it’s most fundamental level this insight comes from realising that “100% code coverage” is not the aim of well tested code, but a by-product!Consider a basic object “ExamResult” that is constructed with a single percentage value.  The object has a read only property returning the percentage and a read only bool value indicating a pass/fail status.  The code for this basic object is shown below:namespace CodeCoverageExample { using System;
publicclassExamResult …

Improving “Boiler Plate” Data-Reader Code – Part 2

In Part 1 of this series we started with a basic Data-Reader / SQL Connection/Command pattern and illustrated how it is possible to abstract the parsing of the Data Reader into a standalone object that can be fully unit tested in isolation of the calling code.   In Part two of the series we will highlight a very simple optimisation that can be made to the “DataReader” convertor and the required update to the tests to capture/verify the changes.  In this revision the original “CustomerDRConvertor” has been updated to include extremely basic caching, which for the duration of the object’s existence should ensure that only the first call needs to reference the “GetOrdinal(…)” method to find the element index of each desired column.  Subsequent calls can then use this “cached” index to reference the column by position rather than name.namespace DataAccess.Example { using System.Data; using System.Data.BoilerPlater;
public classCustomerDRConvertorPart2 : IConvertDataReader<Customer> { priv…

Improving “Boiler Plate” Data-Reader Code – Part 1

Recently we’ve been looking at improving our unit test code coverage and reducing the amount of duplicated code around our bespoke data access layer.  Where possible we have moved over to NHibernate but certain parts of the data access must still be written using the standard ADO.NET connection/command pattern.  Typically hidden right in the middle of this bespoke code is a while loop that is pivoting a data reader into a POCO that is impossible to repeat-ably unit test in a stable environment unless you set up a dedicated data repository for testing or try to wrap up / mock the connection / command objects.   Neither of these options are really desirable as we aren’t really interested in testing / mocking the .NET provider data access objects.To get around this issue we looked into how we could generate some boiler-plate code that we could roll out across our code base.  This code base will be introduced step by step during this series with the first step covering the abstraction of …

MVC3.0 Installation Hangs

I've just installed MVC3.0 on a fresh PC using the new web installer application and was surprised at how long it seemed to be taking.  Digging around a bit deeper I remembered that in the options I'd selected to use IIS rather than IIS Express and taking a quick look at the service panel highlighted that IIS was currently stopped.  I restarted IIS and the MVC3.0 installation finished in seconds!So if you're having problems installing MVC3.0 then just take a moment to check that IIS is started.

VS2010: How to change a "Class Library" project into a "Test Project"

Whilst working with VS2010 projects it can be really frustrating if you accidently create your unit testing projects as class libraries (or migrate an existing class library into a unit testing library mainly because the context sensitive "Add New" menu no longer contains the "New Test" option.  This can be easily fixed by directly amending the project file, adding the following key to main tag:<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> Reload the project in VS2010 and now your class library has become a testing library and you have "Add New Test" option(s) back again.

Accessing GAC DLL's in Visual Studio 2010 "Find References"

Or better titled I've just registered my DLL in the GAC, why does it not appear in Visual Studio's "Find Reference" dialog.It's probably the first thing people notice after they've started using the GAC for the first time. You've managed to register your DLL and you've confirmed it is in the GAC, but it just won't appear in Visual Studio's "Add Reference" dialog box.   As it turns out, for what were probably good reasons, the visual studio team decided to use the registery to hold the list of DLLs that appear in the "Add Reference" dialog box.You have two options, the first is to manually edit the registry - adding your DLL to the following registery keys:[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\AssemblyFolders][HKEY_CURRENT_USER\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\AssemblyFolders]Another option is to install the Visual Studio extension MUSE.VSExtensions, which adds an extra option to the co…

Adding a DLL to the GAC in .NET 4.0

GACUTIL.EXE is no longer supplied / installed along with Visual Studio, instead it has been moved into the Windows SDK v7.1.   So to install a DLL into the GAC for .NET 4.0 (or anything after v1.1 I believe) you must first download and install the SDK.  Once you have done this you must locate the relevant version of GACUTIL from the four possible locations:Program Files\Microsoft SDKs\Windows\v7.1\Bin\Program Files\Microsoft SDKs\Windows\v7.1\Bin\x64Program Files\Microsoft SDKs\Windows\v7.1\Bin\NETFX 4.0 ToolsProgram Files\Microsoft SDKs\Windows\v7.1\Bin\NETFX 4.0 Tools\x64 The first two are for registering DLLs to be used in .NET 3.5 or earlier, with the first being for x86 and the second for x64 versions.The second two are for registering DLLs to be used in .NET 4.0, again with the first being for x86 and the second for x64 versions.With the release of .NET 4.0 the framework now has two GACs, this stackoverflow post explains why.

Javascript: Type and Value Comparison

A common problem when doing value comparison inside of Javascript is the automatic type conversion that happens for you, this means all the following statements resolve to "true".1 == 1;1 == '1';1 == "1";As a little bonus snippet in a post by Steve Wellens he provides an answer to the problem, the triple equals ("===") and it's corresponding not equal ("!==").  These comparison operators perform a type check as well as a value check.  This means that a string value will nolonger equal it's corresponding numeric value as the type check will return false.  A useful bit of functionality to have.

SQL Server Licensing

As part of my current project I’ve spent some time over the past couple of months trying to determine the best (cheapest) SQL Server configuration to support web servers running in a virtualised environment. As a quick disclaimer, the following are my thoughts on the subject and should be used as guidance for further research only!Firstly you need to figure out whether you are going to license using the “per user” or “per processor” model. For most typical configurations a “break even” point can be determined when it becomes cheaper to switch to the per processor licensing model instead of the per user model. It is important however to plan for future growth as it can be very expensive to try and switch from one model to another once a system has been deployed. It is not possible to convert SQL “user” CALs into a processor license.If you are developing a web application that will be exposed via the internet to external customers then it would probably make sense to use the web edition…

Resolving the HTTP/HTTPS “Document contains both secure/unsecure content” message

One of the most commonly encountered issues when developing websites that must support both HTTP and HTTPS pages is the warning that a secure page “contains both secure and unsecure content”. In a nutshell this is when a page that is being displayed via the HTTPS protocol contains one or more references to additional resources (JS/CSS/Images) using just HTTP.The solution is easy and well documented for locally referenced resources, in that when making the reference to the required file you exclude the protocol and domain name ending up with something like “/styles/main.css”, which will quite happily call “main.css” from a “styles” folder in the root of the web application regardless of whether the containing page is being called by HTTP or HTTPS.Note: .NET provides functionality such as ResolveUrl(“~/styles/main.css”) which should always be used in preference to hard coded paths such as “/styles/main.css”. Using ResolveUrl(…) will work regardless whether in IIS the web application has…