我有这个存储过程,在表中插入记录并使用IDENTITY
返回Output Inserted.KID
列值:
ALTER procedure [dbo].[InsertNode]
(
@FName nvarchar(50),
@Lname nvarchar(50),
@CDesc nvarchar(max),
@ParentID int
)
as
begin
insert into Chart (FName , Lname ,CDesc, ParentID )
Output Inserted.KID
values (@FName, @Lname, @CDesc, @ParentID)
end
C#代码:
public void InsertNode(string FName, string LName, string cDesc, int pid)
{
try
{
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString))
{
using (SqlCommand cmd = new SqlCommand("InsertNode", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@FName", FName);
cmd.Parameters.AddWithValue("@Lname", LName);
cmd.Parameters.AddWithValue("@CDesc", cDesc);
cmd.Parameters.AddWithValue("@ParentID", pid);
con.Open();
Int32 retVal = cmd.ExecuteNonQuery();
}
}
}
catch (Exception Ex)
{
Response.Write( "ERROR: Unable to save data !!</br>" + Ex.Message);
}
Response.Write( "Data Saved Successfully!");
}
这是正确的方法吗?
现在,如何从asp.net(c#)中的存储过程中获取OUTPUT
值?
答案 0 :(得分:6)
string connectionString = ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;
string insertStoredProcName = "dbo.InsertNode";
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand(insertStoredProcName, conn))
{
cmd.CommandType = CommandType.StoredProcedure;
-- set up paramters - DO NOT USE AddWithValue !!
cmd.Parameters.Add("@FName", SqlDbType.VarChar, 100).Value = FName;
cmd.Parameters.Add("@Lname", SqlDbType.VarChar, 100).Value = LName;
cmd.Parameters.Add("@CDesc", SqlDbType.VarChar, 100).Value = cDesc;
cmd.Parameters.Add("@ParentID", SqlDbType.Int).Value = pid;
conn.Open();
using(SqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
-- read all returned values - if you only ever insert
-- one row at a time, there will only be one value to read
int insertedId = rdr.GetInt32(0);
}
rdr.Close();
}
conn.Close();
}
答案 1 :(得分:-1)
如果您决定将来在表中添加触发器,OUTPUT将会中断。此外,如果有多个插入,输出将返回每个新插入行的ID。
或者,如果它是单个插入操作,则可以使用ExecuteScalar。
ALTER procedure [dbo].[InsertNode]
(
@FName nvarchar(50),
@Lname nvarchar(50),
@CDesc nvarchar(max),
@ParentID int
)
as
begin
declare @KID int
insert into Chart (FName , Lname ,CDesc, ParentID )
values (@FName, @Lname, @CDesc, @ParentID)
SELECT @KID = SCOPE_IDENTITY();
end
C#:
int KID = Convert.ToInt32(cmd.ExecuteScalar());