Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.135.217.228] |
|
Сообщ.
#1
,
|
|
|
Часто возникает следующая задача - после вставки данных в таблицу с автоинкрементным ключем получить его значение, назначенное сервером БД. Решений данного вопроса может быть несколько: возвращаемое значение хранимой процедуры или использование Output параметра хранимой процедуры.
Второе рассмотрю подетальнее, так как первый вариант проще. Исходные данные: MS SQL Server, тестовая таблица с полями: ID, LOGIN, PWD, NOTES. Первое поле - первичный ключ, bigint, автоинкрементное. Тестовая хранимая процедура: ALTER PROCEDURE dbo.ADD_USER @LOGIN nchar(30), @PWD nchar(30), @NOTES varchar(50), @NEW_ID bigint out AS insert USERS(LOGIN, PWD, NOTES) values(@LOGIN, @PWD, @NOTES) SET @NEW_ID = Scope_Identity() RETURN 1 параметр @NEW_ID указан с модификатором out. Код для тестирования (C#): private SqlConnection conn; // public long CreateUser(string sLogin, string sPwd, string sNotes) { SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "ADD_USER"; cmd.Parameters.Add("@LOGIN", SqlDbType.Char); cmd.Parameters.Add("@PWD", SqlDbType.Char); cmd.Parameters.Add("@NOTES", SqlDbType.VarChar); cmd.Parameters.Add("@NEW_ID", SqlDbType.BigInt); cmd.Parameters["@LOGIN"].Value = sLogin; cmd.Parameters["@PWD"].Value = sPwd; cmd.Parameters["@NOTES"].Value = sNotes; // cmd.Parameters["@NEW_ID"].Direction = ParameterDirection.Output; try { conn.Open(); cmd.ExecuteNonQuery(); long r = (long)cmd.Parameters["@NEW_ID"].Value; return r; } catch (Exception ex) { onError(this, new ErrorEventArgs(ex)); return -1; } finally { if(conn.State == ConnectionState.Open) conn.Close(); cmd.Dispose(); } } как видим, синтаксис вызова хп не очень отличается от стандартного, единственное для параметра @NEW_ID указано направление ParameterDirection.Output и извлекается значение после выполнения ХП. |