Каков наилучший способ добавить / обновить / удалить таблицу поиска в Microsoft SQL с ASP.NET C #? - PullRequest
0 голосов
/ 27 января 2011

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

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

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

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

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

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

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

[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.

Ответы [ 2 ]

1 голос
/ 27 января 2011

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

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

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

В вашем сохраненном процессе вы можете разделить идентификаторы

Стратегия будет выглядеть примерно так: 1. Для переданных идентификаторов удалите записикоторые не соответствуют

SQL для этого будет

УДАЛИТЬ ИЗ ParkActivities, ГДЕ НЕ УКАЗАНО ActivityId (Некоторые списки идентификаторов), ГДЕ ParkId = @ ParkId

Поскольку ваш списокэто строка, которую вы можете сделать следующим образом

EXEC ('УДАЛИТЬ ИЗ ParkActivities, ГДЕ НЕ УКАЗАНО Activity (' + @ActivityIds + ') И ParkId =' + @ParkId)

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

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

0 голосов
/ 27 января 2011

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

update

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...