У меня проблема с SQL Insert в моем gridview

У меня есть gridview, который я настроил, чтобы разрешить вставку в следующую строку моей таблицы. У меня есть проблема, хотя … У меня есть 2 оператора insert и оператор select, который обновляет представление таблиц после завершения вставки. Я вставляю значения в две таблицы … первая обновляет информацию о лицах, а вторая обновляет расписание поездки, чтобы включить их в поездку.

Второй оператор – это то, где я столкнулся с проблемой … когда новая запись вставляется в базу данных, новый PersonID создается автоматически для человека, потому что я установил это как PK и идентификатор для таблицы Person , m не уверен, как взять этот вновь созданный PersonID и вставить его в таблицу TripSchedule .

Вот мой код для вставки нового пользователя:

 protected void AddNewCustomer(object sender, EventArgs e) { string nFirstName = ((TextBox)GridView1.FooterRow.FindControl("txtFirstName")).Text; string nLastName = ((TextBox)GridView1.FooterRow.FindControl("txtLastName")).Text; string nEmergency = ((TextBox)GridView1.FooterRow.FindControl("txtEmergency")).Text; string nCell = ((TextBox)GridView1.FooterRow.FindControl("txtCell")).Text; string nAge = ((TextBox)GridView1.FooterRow.FindControl("txtAge")).Text; string nActivityCard = ((TextBox)GridView1.FooterRow.FindControl("txtActivityCard")).Text; string nInitials = ((TextBox)GridView1.FooterRow.FindControl("txtInitials")).Text; string nBoat = ((TextBox)GridView1.FooterRow.FindControl("txtBoat")).Text; string nGroup = ((TextBox)GridView1.FooterRow.FindControl("txtGroup")).Text; SqlConnection con = new SqlConnection(strConnString); SqlCommand cmd = new SqlCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "insert into Person(FirstName, LastName, Emergency#, Cell#, Age, ActivityCard, CraftType, Initials, Group#) " + "values(@FirstName, @LastName, @Emergency, @Cell, @Age, @ActivityCard, @Boat, @Initials, @Group);" + "insert into TripSchedule(TripType, PersonID, Time, Date) values ('" + ddlTripType.SelectedItem + "', WHAT GOES HERE?, '" + ddlTripTime.SelectedItem + "', '" + TextBox1.Text + "');" + "SELECT Person.PersonID, Person.FirstName AS FirstName, Person.LastName AS LastName, Person.Emergency# AS Emergency#, Person.Cell# AS Cell#, Person.Age AS Age, " + "Person.ActivityCard AS ActivityCard, Person.CraftType AS CraftType, Person.Initials AS Initials, Person.Group# AS Group# " + "FROM Person INNER JOIN " + "TripSchedule ON Person.PersonID = TripSchedule.PersonID where TripSchedule.Date = '" + TextBox1.Text + "' and " + "TripSchedule.Time = '" + ddlTripTime.SelectedItem + "' and TripSchedule.TripType = '" + ddlTripType.SelectedItem + "';"; cmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = nFirstName; cmd.Parameters.Add("@LastName", SqlDbType.VarChar).Value = nLastName; cmd.Parameters.Add("@Emergency", SqlDbType.NChar).Value = nEmergency; cmd.Parameters.Add("@Cell", SqlDbType.NChar).Value = nCell; cmd.Parameters.Add("@Age", SqlDbType.NChar).Value = nAge; cmd.Parameters.Add("@ActivityCard", SqlDbType.NChar).Value = nActivityCard; cmd.Parameters.Add("@Initials", SqlDbType.NChar).Value = nInitials; cmd.Parameters.Add("@Boat", SqlDbType.VarChar).Value = nBoat; cmd.Parameters.Add("@Group", SqlDbType.VarChar).Value = nGroup; GridView1.DataSource = GetData(cmd); GridView1.DataBind(); } 

Я лично разделил бы это, по крайней мере, на два вызова SqlCommand – один для вставки Person , другой – для TripSchedule . Также: вы должны использовать параметризованные запросы по всему – не только в некоторых местах (а не в других …).

Чтобы получить вновь вставленный PersonID , используйте SCOPE_IDENTITY() – что-то вроде этого:

 SqlCommand cmd = new SqlCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "INSERT INTO dbo.Person(FirstName, LastName, Emergency#, Cell#, Age, ActivityCard, CraftType, Initials, Group#) " + "VALUES(@FirstName, @LastName, @Emergency, @Cell, @Age, @ActivityCard, @Boat, @Initials, @Group);" + "SELECT SCOPE_IDENTITY();"; cmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = nFirstName; cmd.Parameters.Add("@LastName", SqlDbType.VarChar).Value = nLastName; cmd.Parameters.Add("@Emergency", SqlDbType.NChar).Value = nEmergency; cmd.Parameters.Add("@Cell", SqlDbType.NChar).Value = nCell; cmd.Parameters.Add("@Age", SqlDbType.NChar).Value = nAge; cmd.Parameters.Add("@ActivityCard", SqlDbType.NChar).Value = nActivityCard; cmd.Parameters.Add("@Initials", SqlDbType.NChar).Value = nInitials; cmd.Parameters.Add("@Boat", SqlDbType.VarChar).Value = nBoat; cmd.Parameters.Add("@Group", SqlDbType.VarChar).Value = nGroup; conn.Open(); int newPersonID = (int)cmd.ExecuteScalar(); conn.Close(); 

Поскольку этот вызов SqlCommand возвращает ровно одну строку, один столбец (вновь вставленный PersonID ), вы можете легко использовать метод .ExecuteScalar() и вы возвращаете вновь вставленный PersonID в результате этого вызова. Теперь вы можете вставить данные в таблицу TripSchedule (и снова: пожалуйста, используйте все параметры для этого вызова!).

Или, альтернативно, оберните все это в одну хранимую процедуру, которая обрабатывает весь этот T-SQL-кунг-фу внутри.

Или еще лучше: в эти дни и времена я лично переключился на ORM, как Entity Framework, чтобы сделать это намного проще

  • Отобразить текст значения NULL SQL Server в режиме сетки
  • C # ASP.NET - невозможно обновить данные через GridView
  • Yii2 Как создать ActiveDataProvider с объединением из разных моделей
  • asp.net получить значение из списка <> Метод
  • Проблема при чтении поля DateTime
  • как оптимизировать событие «foreach» из gridview в веб-форме asp.net?
  • Строка SQL, не разбивающая строки в gridview
  • Краткая дата, указанная в таблице данных SQL, показывает время и полную информацию
  • большой выгравированный GridView, Rollup и Grand Totals с SQLdataSource
  • Получить конкретную строку данных в gridview?
  • Является ли это ошибкой или сложным решением для кодирования с форматированием GridView в режиме редактирования?
  • Давайте будем гением компьютера.