Вопрос о добавлении в базу данных из текста, введенного в текстовое поле

#c# #sql

#c# #sql

Вопрос:

У меня есть приложение, которое отображает данные из базы данных sql в datagrid. Я добавляю функцию, которая позволит пользователю добавлять новый элемент в эту сетку данных. В приложении у меня будет кнопка Добавить, при нажатии на которую откроется новое окно, в которое будет добавлена вся информация. После того, как пользователь вводит информацию в текстовые поля и нажимает Сохранить, эта информация сохраняется в базе данных. Для этого потребуется вставить данные в две отдельные таблицы, которые связаны. Первая таблица — ItemDescriptor, а другая таблица — Accessories. Идентификатор для ItemDescriptor должен быть помещен в таблицу аксессуаров как ItemDescriptorID. Я попытался выполнить два отдельных запроса на вставку, но не могу понять, как программно получить идентификатор из ItemDescriptor в таблицу аксессуаров. Извините, я знаю, это может немного сбить с толку. Дайте мне знать, если потребуется дополнительная информация. Спасибо

 _dbAccess.ExecuteNonQuery("INSERT INTO ItemDescriptor (id, Model, Brand, DeviceName, Type, Notes) VALUES ('"   System.Guid.NewGuid()   "', '"   tbModel.Text   "', '"   tbBrand.Text   "', '"   tbDeviceName.Text   '", '"   cmbType.SelectedValue   "', '"   tbNotes.Text   "')");

_dbAccess.ExecuteNonQuery("INSERT INTO Accessories (id, ItemDescriptorID, StorageRoomCount, OnHandCount, HiBayCount) VALUES ('"   System.Guid.NewGuid()   "', '"    
  

и это примерно все, что я получил … не уверен, как получить ItemDescriptorID из первого запроса.

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

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

Ответ №1:

Во-первых, пожалуйста, пожалуйста, пожалуйста, используйте параметризованные запросы при работе с пользовательским вводом. Эта конкатенация строк просто требует атаки SQL-инъекцией.

Во-вторых, если вы используете SQL Server, вы можете использовать что-то вроде @@IDENTITY , чтобы получить поле идентификации после вставки. Во всех системах есть что-то сопоставимое, поэтому, если вы сообщите нам, что вы используете, мы сможем указать вам правильное направление.

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

1. К сожалению, @@identity это не относится конкретно к вашей области, что означает, что при запуске триггера вы получите последний идентификатор, используемый триггером. Используйте scope_identity() вместо этого. AFAIK, нет причин использовать @@identity когда-либо.

Ответ №2:

Я предполагаю, что вы используете SQL Server и что ItemDescriptor.id является ли столбец идентификатором; правильно?

Если вы выполните следующую команду сразу после вашего первоначального оператора insert, она вернет значение самого последнего сгенерированного идентификатора:

 var newID = _dbAccess.ExecuteScalar("SELECT Scope_Identity()");
  

Вы можете использовать newID для создания вашего второго оператора insert.

Одно предостережение: инструкция SELECT Scope_Identity() должна выполняться в том же экземпляре соединения, что и исходная инструкция insert. Поэтому убедитесь, что вы не закрываете и не открываете заново соединение между операторами. Если это кажется проблемой, вы действительно можете объединить свои инструкции insert и select в одну команду; например:

 var newID = _dbAccess.ExecuteScalar("INSERT [all your code here]; SELECT Scope_Identity();");
  

Удачи!

Ответ №3:

Ответ №4:

Я нашел способ заставить это работать. Я просто сделал guid объектом, а затем использовал его в качестве переменной, и это сработало. спасибо за все предложения.

 Guid guid = System.Guid.NewGuid();

if (_dbaccess != null)
{
_dbAccess.ExecuteNonQuery("INSERT INTO ItemDescriptor (id, Model, Brand, DeviceName, Type, Notes) VALUES ('"   guid   "', '"   tbModel.Text   "', '"   tbBrand.Text   "', '"   tbDeviceName.Text   '", '"   cmbType.SelectedValue   "', '"   tbNotes.Text   "')");

_dbAccess.ExecuteNonQuery("INSERT INTO Accessories (id, ItemDescriptorID, StorageRoomCount, OnHandCount, HiBayCount) VALUES ('"   System.Guid.NewGuid()   "', '"   guid   "', '"   tbStorageRoom.Text   "', '"   tbOnHand.Text   "', '"   tbHiBay.Text   "')"); 
}