SQL数据源 - 存储过程和返回参数

时间:2009-11-04 18:10:41

标签: asp.net sql-server stored-procedures sqldatasource

我在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获取存储过程的返回值?

2 个答案:

答案 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; 
}