Вообще я храню текст сообщений об ошибках в файлах ресурсов. Если вы используете .NET 2.0 или выше (Visual Studio 2005 или выше), файлы ресурсов автоматически скомпилированы в строго типизированные классы, что делает код, который обращается к указанным сообщениям, намного более понятным и читаемым.
(РЕДАКТИРОВАТЬ: После просмотра другого комментария, в котором упоминается локализация, я считаю честью упомянуть об этом и здесь: файлы ресурсов .NET отлично справляются с локализацией. Вы можете получить локализованный текст ресурса с помощью точно такого же код, с несколькими незначительными изменениями для предоставления CultureInfo.)
Тем не менее, похоже, что часть этой проблемной области - это номер сообщения. Эти ошибки выбрасываются из базы данных (скажем, как часть хранимых процедур или триггеров)? В этом случае хранилище базы данных, скорее всего, является для них подходящим местом, хотя бы потому, что оно наиболее точно документирует их там, где используются «магические числа».