SQLMetal не удается создать DBML из базы данных SQL Server 2005

#c# #sql-server #model-view-controller #stored-procedures #sqlmetal

#c# #sql-server #модель-представление-контроллер #хранимые процедуры #sqlmetal

Вопрос:

Как уже сказано в названии, я пытаюсь создать dbml-файл с помощью SQLMetal. Фоном для этого действия является создание C #-Codefile, который содержит все таблицы, функции, представления, хранимые процедуры и так далее для использования в MVC-приложении.

Теперь к проблеме. Когда я запускаю SQLMetal из команды, это занимает много времени, показывает несколько незначительных предупреждений и приводит к ошибке (DBML1057). Когда я читаю сообщение об ошибке, SQLMetal пытается извлечь хранимую процедуру, которая не существует. Я просматривал базу данных дюжину раз, но определенно не мог найти такую процедуру. Возможно, эта процедура была вызвана задолго до этого. т. Е. вы создаете SP с именем «GetGameDatesDesc«, а позже переименовываете его в «GetGameDates«. Я думаю, что SQLMetal (в моем случае) ищет «GetGameDateDesc«. Но откуда у SQLMetal эта информация? Я не могу найти слово в базе данных. Я просмотрел все представления, функции, … bot безрезультатно. Эта функция больше не является частью базы данных.

Редактировать ————— 02/14/2011 —————

Вот предупреждения от SQLMetal:

Ошибка DBML1042: атрибут элемента ‘CCode‘ в элементе столбца элемента типа ‘GetGameDatesDesc‘ уже использовался. Ошибка DBML1057: атрибут хранилища или его значение по умолчанию ‘_CCode‘ в элементе столбца типа ‘GetGameDatesDesc‘ уже использовался.

Комментарии:

1. Я не знаю причину — но, может быть, просто создайте фиктивный sproc, чтобы сделать его счастливым?

2. Для других sprocs это работает так, как должно. Так что это вообще не проблема со sprocs. Я не могу понять, откуда SQLMetal получает информацию о sproc, которая больше не существует. Поэтому, если я смогу найти место, где записано » GetGameDatesDesc «, я мог бы удалить эту запись, и SQLMetal не выдаст ошибку…

Ответ №1:

Похоже, что в одной из ваших существующих хранимых процедур произошла какая-то ошибка. Возможно, вы удалили или переименовали какую-то хранимую процедуру, но у какой-то другой хранимой процедуры все еще есть вызов, который удален или переименован. Попробуйте сгенерировать SQL-скрипт, который создает все хранимые процедуры с помощью SQL Management Studio (щелкните правой кнопкой мыши на database -> Tasks -> Generate Scripts) и найдите в сгенерированном скрипте имя хранимой процедуры, которое вызывает ошибку.

Комментарии:

1. Я уже пробовал это, но имя sproc, которое выдает ошибку, не может быть найдено там.

Ответ №2:

Это досадное ограничение SQLMetal. Поскольку код SP SQL Server information_schema ограничен 4000 символами, SQLMetal использует sys.sql_modules представление для поиска SPS. Но это представление не обновляется sp_rename функцией, поэтому, если вы переименуете SP, SQLMetal не будет работать корректно. Рекомендация, содержащаяся в документации sp_rename, заключается в удалении и воссоздании объектов такого рода:

Переименование хранимой процедуры, функции, представления или триггера не изменит имя соответствующего объекта в столбце определение представления каталога sys.sql_modules. Поэтому мы не рекомендуем использовать sp_rename для переименования этих типов объектов. Вместо этого удалите и заново создайте объект с его новым именем.

Решением было бы удалить этот SP и создать его заново, поскольку SQL Server будет использовать object_id для удаления соответствующей sys.sql_modules строки.

Комментарии:

1. Прав ли я, что SQL Server также удалит все зависимые записи в sys.sql_modules , или мне придется сделать это самому?

2. Да, он использует object_id для удаления соответствующей строки sys.sql_modules.sql_modules.

3. Хорошо. Спасибо. Я мог бы попробовать это завтра. Итак, если возникнут другие ошибки, я сообщу. И, если это решит проблему, я все равно опубликую это здесь 😉

4. Я просмотрел это представление, но там нет записи для старого sproc. Есть другие идеи, где SQLMetal получает информацию о несуществующем sproc?