执行Insert命令并在Sql中返回插入的Id

nee*_*eel 94 c# sql sql-server asp.net-mvc-4

嗨我在MVC4中使用C#将一些值插入到sql表中.实际上我想插入值并返回最后插入记录的"ID".我使用以下代码.

public class MemberBasicData
{
    public int Id { get; set; }
    public string Mem_NA { get; set; }
    public string Mem_Occ { get; set; }     
}
Run Code Online (Sandbox Code Playgroud)

插入时,ID在数据库中自动递增.

public int CreateNewMember(string Mem_NA, string Mem_Occ )
{
    using (SqlConnection con=new SqlConnection(Config.ConnectionString))
    {
        using(SqlCommand cmd=new SqlCommand("INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) VALUES(@na,@occ)",con))
        {
            cmd.Parameters.AddWithValue("@na", Mem_NA);
            cmd.Parameters.AddWithValue("@occ", Mem_Occ);
            con.Open();

            int modified = cmd.ExecuteNonQuery();

            if (con.State == System.Data.ConnectionState.Open) con.Close();
                return modified;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道ExecuteNonQuery表示影响行的数字.而不是我使用

int modified = (int)cmd.ExecuteScalar();
Run Code Online (Sandbox Code Playgroud)

但不行.请帮我解决这个问题.是否有任何代码,如cmd.ExecuteInsertAndGetID()(不使用我的代码).

Ehs*_*san 184

以下解决方案适用于sql server 2005及更高版本.您可以使用输出来获取必填字段.在id的位置,您可以写下您想要返回的密钥.像这样做

FOR SQL SERVER 2005及以上版本

    using(SqlCommand cmd=new SqlCommand("INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) output INSERTED.ID VALUES(@na,@occ)",con))
    {
        cmd.Parameters.AddWithValue("@na", Mem_NA);
        cmd.Parameters.AddWithValue("@occ", Mem_Occ);
        con.Open();

        int modified =(int)cmd.ExecuteScalar();

        if (con.State == System.Data.ConnectionState.Open) 
            con.Close();

        return modified;
    }
}
Run Code Online (Sandbox Code Playgroud)

对于以前的版本

    using(SqlCommand cmd=new SqlCommand("INSERT INTO Mem_Basic(Mem_Na,Mem_Occ)  VALUES(@na,@occ);SELECT SCOPE_IDENTITY();",con))
    {
        cmd.Parameters.AddWithValue("@na", Mem_NA);
        cmd.Parameters.AddWithValue("@occ", Mem_Occ);
        con.Open();

        int modified = Convert.ToInt32(cmd.ExecuteScalar());

        if (con.State == System.Data.ConnectionState.Open) con.Close();
            return modified;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,列名称必须与表的标识列名称匹配.例如,具有此标识列名称的表:`select EmployeeId,*from Employees`在insert语句中需要此片段:`output inserted.EmployeeId` (10认同)
  • 尝试将`int modified =(int)cmd.ExecuteScalar();`转换为int时,我收到了无效的转换错误.我不得不使用Convert将其转换为int.`int modified = Convert.ToInt32(cmd.ExecuteScalar());` (8认同)

Ken*_*nan 41

将查询更改为

"INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) VALUES(@na,@occ); SELECT SCOPE_IDENTITY()"
Run Code Online (Sandbox Code Playgroud)

这将返回最后插入的ID,然后您可以使用它 ExecuteScalar

  • @neel,这是因为scope_identity()返回的数值数据类型只能对十进制.net数据类型进行转换.另一种方法是使用Convert.To <datatype>()系列函数来避免强制转换问题. (2认同)
  • 这个答案更好,因为您不必输入要插入的表的 ID 列。 (2认同)

Hum*_*bir 19

SQL Server存储过程:

CREATE PROCEDURE [dbo].[INS_MEM_BASIC]
    @na varchar(50),
    @occ varchar(50),
    @New_MEM_BASIC_ID int OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO Mem_Basic
    VALUES (@na, @occ)

    SELECT @New_MEM_BASIC_ID = SCOPE_IDENTITY()
END
Run Code Online (Sandbox Code Playgroud)

C#代码:

public int CreateNewMember(string Mem_NA, string Mem_Occ )
{
    // values 0 --> -99 are SQL reserved.
    int new_MEM_BASIC_ID = -1971;   
    SqlConnection SQLconn = new SqlConnection(Config.ConnectionString);
    SqlCommand cmd = new SqlCommand("INS_MEM_BASIC", SQLconn);

    cmd.CommandType = CommandType.StoredProcedure;

    SqlParameter outPutVal = new SqlParameter("@New_MEM_BASIC_ID", SqlDbType.Int);

    outPutVal.Direction = ParameterDirection.Output;
    cmd.Parameters.Add(outPutVal);
    cmd.Parameters.Add("@na", SqlDbType.Int).Value = Mem_NA;
    cmd.Parameters.Add("@occ", SqlDbType.Int).Value = Mem_Occ;

    SQLconn.Open();
    cmd.ExecuteNonQuery();
    SQLconn.Close();

    if (outPutVal.Value != DBNull.Value) new_MEM_BASIC_ID = Convert.ToInt32(outPutVal.Value);
        return new_MEM_BASIC_ID;
}
Run Code Online (Sandbox Code Playgroud)

我希望这些对你有帮助....

如果你想要你也可以使用它...

public int CreateNewMember(string Mem_NA, string Mem_Occ )
{
    using (SqlConnection con=new SqlConnection(Config.ConnectionString))
    {
        int newID;
        var cmd = "INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) VALUES(@na,@occ);SELECT CAST(scope_identity() AS int)";

        using(SqlCommand cmd=new SqlCommand(cmd, con))
        {
            cmd.Parameters.AddWithValue("@na", Mem_NA);
            cmd.Parameters.AddWithValue("@occ", Mem_Occ);

            con.Open();
            newID = (int)insertCommand.ExecuteScalar();

            if (con.State == System.Data.ConnectionState.Open) con.Close();
                return newID;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)