Я вставил некоторые значения в таблицу. Существует столбец, значение которого генерируется автоматически. В следующем утверждении моего кода я хочу получить это значение.
Можете ли вы сказать мне, как это сделать правильно?
Ms SQL Server: это хорошее решение, даже если вы добавляете больше строк:
Declare @tblInsertedId table (Id int not null) INSERT INTO Test ([Title], [Text]) OUTPUT inserted.Id INTO @tblInsertedId (Id) SELECT [Title], [Text] FROM AnotherTable select Id from @tblInsertedId
sql = "INSERT INTO MyTable (Name) VALUES (@Name);" + "SELECT CAST(scope_identity() AS int)"; SqlCommand cmd = new SqlCommand(sql, conn); int newId = (int)cmd.ExecuteScalar();
Какую базу данных вы используете? Насколько я знаю, для этого не существует независимого от базы данных метода.
Вот как я это сделал, используя параметризованные команды.
MSSQL
INSERT INTO MyTable (Field1, Field2) VALUES (@Value1, @Value2); SELECT SCOPE_IDENTITY();
MySQL
INSERT INTO MyTable (Field1, Field2) VALUES (?Value1, ?Value2); SELECT LAST_INSERT_ID();
Помните, что @@ IDENTITY возвращает последний созданный идентификатор для вашего текущего соединения, а не обязательно идентификатор для недавно добавленной строки в таблице. Вы всегда должны использовать SCOPE_IDENTITY () для возврата идентификатора недавно добавленной строки.
Ответ Роба был бы наиболее независимым от поставщика, но если вы используете MySQL , более безопасный и правильный выбор будет встроенной функцией LAST_INSERT_ID().
LAST_INSERT_ID()
Решение Oracle на основе среды:
CREATE OR REPLACE PACKAGE LAST AS ID NUMBER; FUNCTION IDENT RETURN NUMBER; END; / CREATE OR REPLACE PACKAGE BODY LAST AS FUNCTION IDENT RETURN NUMBER IS BEGIN RETURN ID; END; END; / CREATE TABLE Test ( TestID INTEGER , Field1 int, Field2 int ) CREATE SEQUENCE Test_seq / CREATE OR REPLACE TRIGGER Test_itrig BEFORE INSERT ON Test FOR EACH ROW DECLARE seq_val number; BEGIN IF :new.TestID IS NULL THEN SELECT Test_seq.nextval INTO seq_val FROM DUAL; :new.TestID := seq_val; Last.ID := seq_val; END IF; END; / To get next identity value: SELECT LAST.IDENT FROM DUAL
Это должно работать с любой базой данных.
В TransactSQL для этого можно использовать предложение OUTPUT.
INSERT INTO my_table(col1,col2,col3) OUTPUT INSERTED.id VALUES('col1Value','col2Value','col3Value')
FRI: http://msdn.microsoft.com/en-us/library/ms177564.aspx
Самый простой ответ:
command.ExecuteScalar()
по умолчанию возвращает первый столбец
Возвращаемое значение Тип: System.Object Первый столбец первой строки в наборе результатов или нулевая ссылка (Nothing в Visual Basic), если набор результатов пуст. Возвращает максимум 2033 символа.
Скопировано с MSDN