我在SQL Server中有一个存储过程,它返回一个值:
CREATE PROCEDURE [dbo].[insertProc]
@value1 INT,
@value2 INT
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO table1(value1,value2) VALUES (@value1,@value2)
RETURN SCOPE_IDENTITY();
END
我使用SQL数据源从ASP.NET连接到数据库,其配置如下:
InsertCommand="@insertedId = insertProc"
InsertCommandType="StoredProcedure"
oninserting="sqlDS_Inserting"
oninserted="sqlDS_Inserted"
<InsertParameters>
<asp:Parameter Name="value1" />
<asp:Parameter Name="value2" />
<asp:Parameter Name="insertedId" DbType="Int32" Direction="ReturnValue" />
</InsertParameters>
我想做什么来获取返回的值。在sqlDS_Inserted
程序的主体中,我喜欢这样:
this.insertedId = Convert.ToInt32(e.Command.Parameters["insertedId"].Value);
但我收到错误:
Object cannot be cast from DBNull to other types.
但是,当我查看SQL Server Profiler并运行命令(添加@insertedId变量的声明)时,它运行良好。有什么问题,如何从ASP.NET获取存储过程的返回值?
答案 0 :(得分:2)
我认为这句话是你的问题。
InsertCommand="@insertedId = insertProc"
您无需将存储过程的返回值显式指定给返回值参数。只需指定存储过程的名称。
InsertCommand = "InsertProc"
另一件事是您必须在OnInserted
事件处理程序中的参数名称前加上'@'。
this.insertedId = Convert.ToInt32(e.Command.Parameters["@insertedId"].Value);
答案 1 :(得分:0)
试试这个:
{
SqlConnection conMyData = default(SqlConnection);
SqlCommand cmdInsert = default(SqlCommand);
SqlParameter parmReturnValue = default(SqlParameter);
long l = 0;
conMyData = new SqlConnection(_SQLDBConnString);
cmdInsert = new SqlCommand("insEmployee", conMyData);
{
cmdInsert.CommandType = CommandType.StoredProcedure;
parmReturnValue = cmdInsert.Parameters.Add("RETURN_VALUE", SqlDbType.BigInt);
parmReturnValue.Direction = ParameterDirection.ReturnValue;
cmdInsert.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = strFirstName;
cmdInsert.Parameters.Add("@MiddleInitial", SqlDbType.VarChar).Value = strMI;
conMyData.Open();
cmdInsert.ExecuteNonQuery();
l = (long)cmdInsert.Parameters("RETURN_VALUE").Value;
}
return l;
}