Asp.net 将值从存储过程返回到textbox

Asp.net 将值从存储过程返回到textbox,asp.net,sql-server,webforms,ado.net,Asp.net,Sql Server,Webforms,Ado.net,无法将输出所需的值ID值返回到表单中的文本框。Webforms和ADO.net 我尝试添加一个param identity作为int和OUT子句,同时设置identity=scope\u identity并返回值,然后使用团队当前用于ExecuteNonQuery的模式,匿名参数类传入值,并尝试将@identity值传递给id的textbox.text DataManager.Db.ExecuteNonQuery("DefaultConnection", "usp_CreateNewSalesT

无法将输出所需的值ID值返回到表单中的文本框。Webforms和ADO.net

我尝试添加一个param identity作为int和OUT子句,同时设置identity=scope\u identity并返回值,然后使用团队当前用于
ExecuteNonQuery
的模式,匿名参数类传入值,并尝试将@identity值传递给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。通常,您可以使用
SqlCommand
对象上的
ExecuteNonQuery()
方法在“pure”ADO.NET中调用这样的存储过程,因为它是
INSERT
语句

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

假设您总是只返回
SCOPE\u IDENTITY()
值-最好是这样:

SELECT SCOPE_IDENTITY();
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
这只是一个值-您可以在
SqlCommand
对象上使用
.ExecuteScalar()
方法-如下所示:

SELECT SCOPE_IDENTITY();
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存储过程将始终返回受存储过程影响的行数-如果可以,请不要更改“标准”行为。

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

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

假设您总是只返回
SCOPE\u IDENTITY()
值-最好是这样:

SELECT SCOPE_IDENTITY();
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
这只是一个值-您可以在
SqlCommand
对象上使用
.ExecuteScalar()
方法-如下所示:

SELECT SCOPE_IDENTITY();
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存储过程将始终返回受存储过程影响的行数-如果可以,请不要更改该“标准”行为