#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 "')");
}