Мне нужна помощь с sql и таблицами связи данных

#asp.net #sql #visual-studio-2010

#asp.net #sql #visual-studio-2010

Вопрос:

я создаю мини-сайт форума .. и я создал несколько таблиц.

1) Пользователи 2) Темы 3) Комментарии 4) Темы

я создаю функцию, которая вставляла бы комментарий каждый раз, когда пользователь отправлял бы комментарий:

          string saveComment = "INSERT INTO Comments(";
     saveComment  = " UsersID, ThreadsID, Date, Comments, CommentResponse";


     saveComment  = "Values('"   "','";// no idea what to insert in the UsersID
     saveComment  = ""   "','";// no idea what to insert in the ThreadsID

     saveComment  = DateTime.Now   "','";
     saveComment  = CommenttxtBox.Text   "','";
     saveComment  = commentResponseString   "')";
  

Как вы можете видеть, поля имеют UsersID и ThreadId, оба связаны внешним ключом с таблицей комментариев.
Теперь, каждый раз, когда пользователь отправляет комментарий, я предполагаю, что мне нужно вставить также в поле UsersID (которое является значением int в таблице комментариев, и это поле постепенно увеличивается на 1 в таблице Users). Как я могу вставить комментарий и уведомить другую таблицу, чтобы она не увеличивала идентификатор пользователя на 1. на самом деле я хочу, чтобы идентификатор пользователя оставался неизменным для каждого пользователя, отправляющего комментарий..

Как мне это сделать? мне нужно вставить в несколько полей в одной таблице (комментарии), но информировать другие таблицы о том, что на самом деле это тот же пользователь, который отправил комментарий.

Примечание: я не знаю ни одного vb, только c #, и я использую Visual Studio 2010. asp.net

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

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

2. Потому что они связаны ссылками

Ответ №1:

Кстати, способ вставки — это проблема безопасности, вы можете получить SQL-инъекцию…

Используйте system.data.sqlclient.sqlparameters для передачи значений.

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

1. есть ли способ преобразовать эти таблицы в объекты? чтобы я мог программировать на c#

2. LinqToSql был бы решением… но лично мне это не нравится. Если вы ищете оптимизированную обработку данных, вам нужно будет создавать свои собственные объекты.

3. почему вам это не нравится? в чем его недостаток. если я использую команды SQL, приходится писать много инструкций, и это также означает, что мне нужно начать изучать sql. я не знаю языка sql!!

4. SQL довольно прост. И синтаксис LINQ не так прост. LINQ сгенерирует множество sql-запросов, которые можно упростить в одном запросе… Зависит от сложности вашего проекта.

5. я прочитал в книге о ADO.NET и linq для sql. Подход LINQ для меня проще, потому что я привык к C #, и я новичок в синтаксисе SQL .. все, что требуется, это поместить оператор using, создать объект / или получить его обратно, изменить его и вернуть в таблицу .. легко!!

Ответ №2:

Вы создаете очень стандартную нормализованную структуру. Ваша Users таблица будет отвечать за управление UserID значениями, которые генерируются.

При вставке новых комментариев вам нужно справиться с двумя ситуациями:

  1. Пользователь существует и вошел в систему.
  2. Пользователь не существует и является анонимным.

В первой ситуации, когда вы вставляете комментарии, вам не нужно будет утруждать себя просмотром Users таблицы. Предполагается, что UserID у вас уже загружено (поскольку пользователь вошел в систему).

Во второй ситуации вам сначала потребуется ввести новую строку в Users таблицу и вернуть UserID ту, которую генерирует таблица (при условии, что вы используете столбец идентификаторов). Затем вы можете передать это значение в Comments таблицу.

Следующий сценарий является примером решения второй ситуации:

 DECLARE @userId int

INSERT INTO Users (Username, FirstName)
VALUES ('adamh', 'Adam')

SET @userId = SCOPE_IDENTITY()

INSERT INTO Comments(UserId, ThreadId, Comment)
VALUES (@userId, 1, 'My comment')
  

Если вы хотите продолжить свой текущий стиль кодирования, просто объедините значения в соответствующие части строки.

Однако, с такой четко определенной структурой, как у вас, я бы посоветовал использовать что-то вроде Entity Framework 4.0 или LINQ to SQL, что сокращает много работы, как только вы определили свои структуры.

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

1. я думаю, мне нужно больше изучать sql, потому что я не понимаю, что означают все эти значения.. Установить, объявить… как вы думаете, есть ли способ преобразовать SQL в C #. я знаю, что это делается, когда вы используете атрибут таблицы [table] над классом, а затем используете класс .. но я забыл, как это делается