Получить значение scope_identity в коде C# из хранимой процедуры в трехуровневой архитектуре

Мне нужно получить значение scope_identity() из хранимой процедуры после вставки данных в код C#.

Здесь я использую трехуровневую архитектуру. Пожалуйста, помогите мне

protected void Submit_Click(object sender, EventArgs e)
{
    this.CreateUserGroups(strGroupName, strDescription, strGroupType);
}

protected void CreateUserGroups(string strGroupName, string strDescription, string strGroupType)
{
    string strReturn = string.Empty;
    strReturn = objUser.SaveCreateGroups(strGroupName, strDescription, strGroupType);
}

public string SaveCreateGroups(string strGroupName, string strDescription, string strGroupType)
{
    try
    {
        DataManager.ParamBuilder param = new DataManager.ParamBuilder();
        if (strGroupName != string.Empty)
            param.AddParam(System.Data.SqlDbType.VarChar, "@c_groupname", strGroupName);
        else
            param.AddParam(System.Data.SqlDbType.Int, "@c_groupname", DBNull.Value);

        if (strDescription != string.Empty)
            param.AddParam(System.Data.SqlDbType.VarChar, "@c_description", strDescription);
        else
            param.AddParam(System.Data.SqlDbType.Int, "@c_description", DBNull.Value);

        if (strGroupType != string.Empty)
            param.AddParam(System.Data.SqlDbType.Int, "@n_grouptype", strGroupType);
        else
            param.AddParam(System.Data.SqlDbType.VarChar, "@n_grouptype", DBNull.Value);


        String strIsUserExitsInGroup = DataManager.ExecuteScalar("sp_create_user_groups", param.Parameters, true).ToString();

        return strIsUserExitsInGroup;
    }
    catch (Exception e)
    {
        throw new Exception(e.ToString());
    }
}

public static object ExecuteScalar(string procedureNameOrSql, List<SqlParameter> parameters, bool isStoredProcedure)
{
    object scalarValue;
    using (SqlConnection cn = createConnection())
    {
        SqlCommand cmd = new SqlCommand(procedureNameOrSql, cn);
        if (isStoredProcedure)
            cmd.CommandType = CommandType.StoredProcedure;
        if (parameters != null)
            cmd.Parameters.AddRange(parameters.ToArray());
        scalarValue = cmd.ExecuteScalar();
    }
    return scalarValue;
}

Моя хранимая процедура:

CREATE Procedure [dbo].[sp_create_user_groups]
  @n_user_group_id int OUTPUT,
  @c_groupname varchar(200),
  @c_description varchar(200),
  @n_grouptype int
As
   Declare @IsGroupNameExists int,        
           @b_active bit

   select @IsGroupNameExists = 0
   set @b_active = 1

BEGIN
IF exists(select top 1 * from gdt_user_groups where c_group_name = @c_groupname)
BEGIN
 select @IsGroupNameExists = 1
END
ELSE
 BEGIN
    SET NOCOUNT ON;
    insert into gdt_user_groups(c_group_name,c_description,n_group_id,b_active,d_modified_dttm,
    d_created_dttm)values(@c_groupname,@c_description,@n_grouptype,@b_active,GETDATE(),GETDATE())
    select @n_user_group_id = SCOPE_IDENTITY();
    select @IsGroupNameExists = 0
 END 

 select @IsGroupNameExists
 END

Вот где именно я могу получить значение scope_identity в коде C#. Кто-нибудь поможет?


person Nirmala    schedule 16.11.2012    source источник


Ответы (2)


Вам нужно получить значение через выходной параметр, поэтому вы должны перейти по этой ссылке:
Получить значение выходного параметра в ADO.NET
Как использовать параметр OUTPUT в хранимой процедуре

вам просто нужно создать SqlParameter, установить направление для вывода и добавить его в коллекцию параметров SqlCommand. Затем выполните хранимую процедуру и получите значение параметра.

При добавлении параметра выполните следующие действия после добавления дополнительного параметра в ваш метод.

param.AddParam(SqlDbType.Int, "@c_Id", IdValue, ParameterDirection.Output);

затем получите доступ к значению вашего выходного параметра, как показано ниже:

object value = cmd.Parameters["@c_Id"].Value;

Источник: Получение идентификатора последней добавленной записи Фрагмент кода:

string query = "AddCategory";
int ID;
string connect = @"Server=.\SQLExpress;Database=Northwind;Trusted_Connection=Yes;";
using (SqlConnection conn = new SqlConnection(connect))
{
  using (SqlCommand cmd = new SqlCommand(query, conn))
  {
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@Category", Category.Text);
    cmd.Parameters.Add("@CategoryID", SqlDbType.Int, 0, "CategoryID");
    cmd.Parameters["@CategoryID"].Direction = ParameterDirection.Output;
    conn.Open();
    cmd.ExecuteNonQuery();
    ID = (int)cmd.Parameters["@CategoryID"].Value;
  }
}

процедура...

CREATE PROCEDURE AddCategory
  -- Add the parameters for the stored procedure here
  @Category NVARCHAR(15),
  @CategoryID INT OUTPUT
AS
BEGIN
  SET NOCOUNT ON;

  -- Insert statements for procedure here
  INSERT INTO Categories (CategoryName) VALUES (@Category)
  SET @CategoryID = SCOPE_IDENTITY()
END

Надеюсь, приведенная выше ссылка поможет вам лучше понять все это.

person Niranjan Singh    schedule 16.11.2012
comment
Однако переменная @n_user_group_id является выходным параметром хранимой процедуры. - person J. Steen; 16.11.2012
comment
@Ниранджан Кала, хорошо. как я могу получить это значение в коде С#. Потому что здесь я использую Sqlcommand на другом уровне, так как он будет использоваться другими функциями, поэтому я не могу получить значение идентификатора области на этом этапе???? - person Nirmala; 16.11.2012
comment
я обновил свой ответ .. проверьте это. теперь это более актуально - person Niranjan Singh; 16.11.2012

Прочитайте эту статью: http://www.mikesdotnetting.com/Article/54/Getting-the-identity-of-the-most-recently-added-record

И получить ваш уровень принятия выше.

person Steve Wellens    schedule 16.11.2012