【问题标题】:SQL Data Source - store procedure and return parameterSQL 数据源 - 存储过程和返回参数
【发布时间】:2010-12-13 03:16:32
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    我认为这句话是你的问题。

    InsertCommand="@insertedId = insertProc"
    

    您不需要将存储过程的返回值显式分配给返回值参数。只需指定存储过程的名称即可。

     InsertCommand = "InsertProc"
    

    另一件事是,您必须在 OnInserted 事件处理程序中的参数名称前加上“@”。

    this.insertedId = Convert.ToInt32(e.Command.Parameters["@insertedId"].Value);
    

    【讨论】:

    • 很遗憾你是对的!我在开始时尝试使用和不使用 @insertedId(以及许多其他选项),在 OnInserted 中使用或不使用 @,但我想我从未尝试过这种配置。不管怎样,谢谢。现在可以了。
    【解决方案2】:

    试试这个:

    { 
        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; 
    } 
    

    【讨论】:

    • 这样你也不必发送输出参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    相关资源
    最近更新 更多