2011-01-26 2 views
0

Я работаю над проектом местного города и имею некоторые вопросы по эффективному созданию отношений между «парками» и «действиями» в Microsoft SQL 2000. Мы используем ASP.NET C# доКаков наилучший способ добавить/обновить/удалить таблицу поиска в Microsoft SQL с помощью ASP.NET C#?

У меня есть две мои таблицы " Парки "и" Мероприятия ". Я также создал таблицу поиска с правильными отношениями, установленными на первичных ключах как «Парки», так и «Действия». Моя таблица поиска называется «ParksActitivies».

У нас есть около 30 мероприятий, которые мы можем связать с каждым парком. Стажер будет управлять веб-сайтом, и мероприятия будут оцениваться каждые 6 месяцев.

До сих пор я создал административный инструмент, который позволяет добавлять/редактировать/удалять каждый парк. Добавление парка просто. Данные новые, поэтому я просто разрешаю им редактировать данные парка и связывать «Деятельности», динамически вытаскиваемые из базы данных. Это было сделано в режиме репитера.

Редактирование работает, но я не чувствую, что это так эффективно, как могло бы быть. Сохранение основных деталей парка не представляет проблемы, так как я просто вызываю Save() на экземпляр парка, который я создал. Тем не менее, для удаления устаревших записей в таблице поиска я просто DELETE FROM ParksActitivies WHERE ParkID = @ParkID ", а затем INSERT запись для каждого из проверяемых видов деятельности.

Для моего ID колонке таблицы перекодировки, у меня есть увеличивающееся целое значение, которое после довольно немного тестирования в тысячи. Хотя это работает, я считаю, что должен быть лучший способ обновить таблицу поиска.

Может ли кто-нибудь предложить некоторое представление о том, как я могу улучшить это? используя хранимые процедуры, но я не лучший в очень сложных заявлениях.

[ParkID | ParkName | Latitude | Longitude ] 
1  | Freemont | -116.34 | 35.32 
2  | Jackson | -116.78 | 34.2  


[ActivityID | ActivityName | Description ] 
1   | Picnic  | Blah 
2   | Dancing  | Blah 
3   | Water Polo | Blah 

[ID | ParkID | ActivityID ] 
1 | 1  | 2 
2 | 2  | 1 
3 | 2  | 2 
4 | 2  | 3 

Я бы предпочел узнать, как сделать это более универсальным способом, а не использовать Linq-To-SQL или ADO.NET.

+1

использовать ОРМ? что не так с использованием LINQ2SQL? –

+0

@Mitch: я не уверен, что он поддерживает SQL Server 2000. –

+0

Я был бы обеспокоен использованием SQL 2000; не может быть так много месяцев, пока поддержка не будет остановлена ​​... –

ответ

1

хотел бы узнать, как сделать это более универсальным способом, а не использовать LINQ2SQL или ADO.NET.

Вы, очевидно, используете ADO.NET Core :). И это прекрасно, я думаю, вы должны придерживаться использования хранимых процедур и DbCommands и т. Д.

Если вы использовали MSSQL 2008, вы могли бы сделать это с помощью параметров TableValued и оператора MERGE. поскольку вы используете MSSQL 200 (почему?), что вам нужно сделать, это следующее: 1. Отправьте список идентификаторов активности (новых) с разделителями-запятыми вместе с ParkId на ваш сохраненный proc. Параметр ActivityIds был бы, например, varchar (50).

В хранимой прок можно разделить идентификаторы

стратегия будет что-то вроде 1.Для Идентификаторы прошло в, удалять записи, которые не соответствуют

SQL, как это было бы

DELETE FROM ParkActivities WHERE NOT IN ID действия (некоторые список идентификаторов) WHERE ParkId = @ParkId

Поскольку ваш список является строкой, вы можете сделать это, как этот

EXEC ('DELETE FROM ParkActivities WHERE NOT IN ID действия (' + @ActivityIds + ') И ParkId =' + @ParkId)

  1. Теперь вы можете вставить те действия, которые еще не указаны в таблице. Самый простой способ сделать это - вставить идентификаторы ParkActivity в временную таблицу. Для этого вам нужно разбить список с разделителями-запятыми на отдельные идентификаторы и вставить их в таблицу temp. После того, как у вас есть данные в таблице temp, вы можете вставить выполнение соединения.

Это встроенная пользовательская функция в MSSQL 2000, которая может выполнять разделение и возвращать переменную таблицы с каждым значением в отдельной строке. http://msdn.microsoft.com/en-us/library/Aa496058

+0

Спасибо, Шив! Я нашел веб-сайт о том, как создать функцию, которая превращает список, разделенный запятыми, в таблицу по адресу http://www.sommarskog.se/arrays-in-sql-2000.html. Причина, по которой я использую SQL 2000, не обусловлена ​​выбором. Да, есть люди, которые там все еще работают, особенно некоторые более мелкие правительственные учреждения. –

+0

Mr. Square, да, я полностью понимаю, что нужно использовать MSSQL 2000. Поскольку вы используете ядро ​​ADO.NET, вам может понадобиться посмотреть некоторые записи в блоге в моем блоге. http://www.matlus.com/datareader-wrappers-typesafe/, DataReader Wrappers рассказывает о том, как вы можете использовать DbDataReaders (по соображениям производительности) и все же получить сильную типизацию. http://www.matlus.com/data-access-layer-codegen/, Data Access Layer CodeGen сообщение об инструменте, который я использую для генерации большого количества кода уровня доступа к данным при использовании хранимых процедур. Вам может показаться, что это удобно. –

0

Что не так с LinqToSQL и ADO.NET? Я имею в виду, вы могли бы указать ваши сомнения относительно использования этих технологий

обновления

если LinqToSql не поддерживается 2000, вы можете легко перейти бесплатно 2008 экспресс. Это было бы достаточно для целей, которые вы описали.

Смежные вопросы