De manière générale, je conserve le texte des messages d'erreur dans les fichiers de ressources. Si vous utilisez .NET 2.0 ou supérieur (Visual Studio 2005 ou supérieur), les fichiers de ressources sont automatiquement compilés en classes fortement typées, ce qui rend le code qui accède à ces messages beaucoup plus clair et lisible.
(EDIT: Ayant vu un autre commentaire qui mentionne la localisation, je me sens obligé de le mentionner ici aussi: Les fichiers de ressources .NET font un excellent travail de localisation.Vous pouvez obtenir le texte localisé de la ressource via l'exact même code, avec juste quelques ajustements mineurs pour fournir CultureInfo.)
Cela dit, il semble qu'une partie de ce domaine de problème est un numéro de message. Est-ce que ces erreurs sont lancées à partir de la base de données (par exemple, dans le cadre de procs ou de déclencheurs stockés)? Dans ce cas, le stockage de la base de données est probablement le bon endroit pour eux, ne serait-ce que parce que cela les documente le plus près de l'endroit où les «nombres magiques» sont utilisés.