#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?