【问题标题】:Return value to textbox from stored procedure从存储过程返回值到文本框
【发布时间】:2020-01-07 15:38:12
【问题描述】:

无法将我需要输出的值 ID 值返回到表单中的文本框。网络表单和 ADO.net

我尝试将参数标识添加为 int 和 OUT 子句,同时设置 identity = scope_identity 并返回值,然后使用我的团队当前用于 ExecuteNonQuery 的模式,匿名参数类传入值并尝试传递 @ id 的 textbox.text 的标识值。

DataManager.Db.ExecuteNonQuery("DefaultConnection", "usp_CreateNewSalesTerritory", 
                        new SqlParameter("@orgId", orgId),
                        new SqlParameter("@identity", salesTerritoryIdTextBox.Text),
                        new SqlParameter("@salesTerritoryName", salesTerritories.Name), 
                        new SqlParameter("@createdBy", salesTerritories.CreatedBy), 
                        new SqlParameter("@createdDate", salesTerritories.CreatedDate),
                        new SqlParameter("@updatedBy", salesTerritories.UpdatedBy),
                        new SqlParameter("@updatedDate", salesTerritories.UpdatedDate),
                        new SqlParameter("@isActive", salesTerritories.IsActive));


CREATE PROCEDURE dbo.usp_CreateNewSalesTerritory
    @orgId              VARCHAR(255), 
    @salesTerritoryName VARCHAR(255), 
    @createdBy          VARCHAR(255), 
    @createdDate        DATETIME,
    @updatedBy          VARCHAR(255),
    @updatedDate        DATETIME,
    @isActive           BIT,
    @identity           INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO SalesTerritory (OrganizationId, Name, IsActive, 
                                CreatedBy, CreatedDate, UpdatedBy, UpdatedDate)
    VALUES (@orgId, @salesTerritoryName, @isActive, 
            @createdBy, @createdDate, @updatedBy, @updatedDate);

    --SELECT SCOPE_IDENTITY();

    --RETURN SCOPE_IDENTITY();

    --SELECT @@IDENTITY;
    SET @identity = SCOPE_IDENTITY()
END;

RETURN @identity

我希望获得该记录的新插入 ID 值,但我在屏幕上获得了默认值 0

【问题讨论】:

    标签: asp.net sql-server webforms ado.net


    【解决方案1】:

    通常,您会使用SqlCommand 对象上的.ExecuteNonQuery() 方法在“纯”ADO.NET 中调用这样的存储过程——因为它是一个INSERT 语句。

    但现在,您的存储过程实际上是返回一些数据 - 所以您确实需要将其视为“正常”SELECT 存储过程。

    假设您总是只返回 SCOPE_IDENTITY() 值 - 最好像这样:

    SELECT SCOPE_IDENTITY();
    

    这只是一个单一的值 - 您可以在 SqlCommand 对象上使用 .ExecuteScalar() 方法 - 像这样:

    object returned = sqlCmd.ExecuteScalar();
    
    if (returned != null)
    {
        int newIdValue = Convert.ToInt32(returned);
    }
    // else -> nothing was returned, so most likely no row has been inserted -> handle it appropriately
    

    因此,也许您已经在您的 DataManager.Db 对象上为 .ExecuteScalar() 提供了一个“包装器”方法 - 或者您可能需要添加它。试一试 - 我很确定这会解决问题。

    我会避免使用RETURN ... 语句 - 默认情况下,SQL Server 存储过程将始终返回受存储过程影响的行数 - 如果可以,请不要更改“标准”行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多