如何将插入记录的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
检查ExecuteNonQuery()上的文档:
对连接执行Transact-SQL语句,返回受影响的行数
(强调矿)
如果你想取回信息,你有几个选择:
- 将
RETURN
更改为SELECT
,将ExecuteNonQuery()
更改为ExecuteScalar()
- 使用
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 ;
}
}