En general, conservo el texto de los mensajes de error en los archivos de recursos. Si está usando .NET 2.0 o superior (Visual Studio 2005 o superior), los archivos de recursos se compilan automáticamente en clases fuertemente tipadas, haciendo que el código que accede a dichos mensajes sea mucho más claro y legible.
(EDIT: Al ver otro comentario que menciona la localización, me siento honrado de mencionarlo aquí también: los archivos de recursos .NET hacen un excelente trabajo de localización. Puede obtener el texto localizado del recurso a través de la mismo código, con solo algunos ajustes menores para proporcionar CultureInfo.)
Dicho esto, parece que una parte de este dominio de problema es un número de mensaje. ¿Se están lanzando estos errores desde la base de datos (por ejemplo, como parte de procesos o activadores almacenados)? En ese caso, el almacenamiento de la base de datos es probablemente el lugar correcto para ellos, aunque solo sea porque eso los documenta más cerca de donde se usan los "números mágicos".