如何将插入记录的ID返回给C#

本文关键字:ID 返回 记录 插入 | 更新日期: 2023-09-27 18:29:15

我有这个存储过程:

Insert into dbo.file_row (file_sub_type) values (@file_sub_type)
DECLARE @result int;
SET @result = SCOPE_IDENTITY()
RETURN @result;

这可以很好地在SSMS中返回id。然而,当我从C#调用它时,它返回-1。

var connection = GetSqlConnection();
connection.Open();
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "InsertInto_file_row";
command.Parameters.Add(new SqlParameter("@file_sub_type", fileType));
int result = command.ExecuteNonQuery();
connection.Close();
return result;

我看不出我做错了什么。我只需要插入的记录的Id。

Greg

如何将插入记录的ID返回给C#

检查ExecuteNonQuery()上的文档:

对连接执行Transact-SQL语句,返回受影响的行数

(强调矿)

如果你想取回信息,你有几个选择:

  1. RETURN更改为SELECT,将ExecuteNonQuery()更改为ExecuteScalar()
  2. 使用OUTPUT参数

添加到Joel的响应中尝试使用ExecuteScalar而不是

执行查询,并返回查询返回的结果集中第一行的第一列。将忽略其他列或行。(覆盖DbCommand.ExecuteScaler()。)

这将对您有所帮助。如果插入新行,函数将返回新的"标识"列值,失败时返回0。它来自MSDN

static public int AddProductCategory(string newName, string connString)
{
   Int32 newProdID = 0;
   string sql =
    "INSERT INTO Production.ProductCategory (Name) VALUES (@Name); "
    + "SELECT CAST(scope_identity() AS int)";
   using (SqlConnection conn = new SqlConnection(connString))
  {
    SqlCommand cmd = new SqlCommand(sql, conn);
    cmd.Parameters.Add("@Name", SqlDbType.VarChar);
    cmd.Parameters["@name"].Value = newName;
    try
    {
        conn.Open();
        newProdID = (Int32)cmd.ExecuteScalar();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}
return (int)newProdID;

}

public int AddProductCategory(string newName, string connString)
    {
          string sql =
    "INSERT INTO Production.ProductCategory (Name) VALUES (@Name); "
    + "SELECT CAST(scope_identity() AS int)";
        using (SqlConnection con = new SqlConnection(conString))
        {
            using (SqlCommand cmd = new SqlCommand(query, con))
            {
                cmd.Parameters.AddWithValue("@Name", newName);
               
                con.Open();
                latestInsertedId = (int)cmd.ExecuteScalar();
                con.Close();
            }
            return latestInsertedId ;
        }
    }