У меня этот код в моем приложении, и он работает нормально. Я не использовал SCOPE_IDENTITY, поскольку я слышал его старый метод. Может ли кто-нибудь проверить, применяю ли я правильный метод для получения последнего вставленного идентификатора записи? Будет ли это работать? Если я добавлю транзакцию?
using (SqlCommand com = new SqlCommand("INSERT INTO App_Users (UserName, Description) OUTPUT INSERTED.UserID " +
"VALUES (@pUserName, @pDescription); ", con))
{
com.Parameters.AddWithValue("@pUserName" ,userNameTxt.Text );
com.Parameters.AddWithValue("@pDescription" , userDescription.Text);
int lastID = Convert.ToInt32(com.ExecuteScalar());
foreach (ListViewItem lit in ListView3.Items)
{
HiddenField gid = (HiddenField)lit.FindControl("ListGroupID");
int gidVal = 0;
if (gid != null && gid.Value != null && !Int32.TryParse(gid.Value, out gidVal)) gidVal = 0;
if (gidVal != 0)
{
com.CommandText = "INSERT INTO App_UserGroups (UserID, GroupID) " +
"VALUES ( " + lastID + ", " + gidVal + ")";
com.ExecuteNonQuery();
}
}
вы можете использовать scope_identity:
using (SqlCommand com = new SqlCommand("INSERT INTO App_Users (UserName, Description) " + " VALUES (@pUserName, @pDescription);" + "SELECT CAST(scope_identity() AS int)" , con))
Я столкнулся с тем же вопросом несколько дней назад, и я нашел этот пост SO, объясняющий каждый способ извлечения вставленного id из таблицы.
Чтобы ответить на ваш вопрос, оба OUTPUT_CLAUSE
и IDENT_CURRENT
могут использоваться в этом сценарии, даже если вы добавляете транзакцию, но я бы recomment IDENT_CURRENT
потому что предложение OUTPUT вернет строки клиенту, даже если оператор встречает ошибки и откатывается назад.
Используйте его как @horHay, предложенный в комментариях как:
using (SqlCommand com = new SqlCommand("INSERT INTO App_Users (UserName, Description)"+ "VALUES (@pUserName, @pDescription) SELECT IDENT_CURRENT('App_Users'); ", con))
Я бы не предложил SCOPE_IDENTITY
или @@IDENTITY
потому что он может возвращать неправильные значения (null), если вы не используете SQL Server 2008 R2 SP2 или выше (исходная - последняя строка со страницы.), Особенно для вашего требования (вставка значения в другая таблица).
mysql
кстати?SCOPE_IDENTITY
не старый. Кто это сказал? Вы когда-нибудь пытались его использовать?