gpt4 book ai didi

c# - 在 C# 中使用存储过程输出参数

转载 作者:IT王子 更新时间:2023-10-29 03:48:49 25 4
gpt4 key购买 nike

我在将 Sql Server 存储过程的输出参数返回到 C# 变量时遇到问题。我已经阅读了与此相关的其他帖子,不仅在这里而且在其他网站上,我无法让它工作。这是我目前拥有的。目前我只是想打印返回的值。以下代码返回空值。我试图返回的是主键。我尝试使用 @@IDENTITYSCOPE_INDENTITY()(即 SET @NewId = SCOPE_IDENTITY())。

存储过程:

CREATE PROCEDURE usp_InsertContract
@ContractNumber varchar(7),

@NewId int OUTPUT
AS
BEGIN

INSERT into [dbo].[Contracts] (ContractNumber)
VALUES (@ContractNumber)

Select @NewId = Id From [dbo].[Contracts] where ContractNumber = @ContractNumber
END

打开数据库:

pvConnectionString = "Server = Desktop-PC\\SQLEXPRESS; Database = PVDatabase; User ID = sa;
PASSWORD = *******; Trusted_Connection = True;";

try
{
pvConnection = new SqlConnection(pvConnectionString);
pvConnection.Open();
}
catch (Exception e)
{
databaseError = true;
}

执行命令:

pvCommand = new SqlCommand("usp_InsertContract", pvConnection);

pvCommand.Transaction = pvTransaction;
pvCommand.CommandType = CommandType.StoredProcedure;

pvCommand.Parameters.Clear();
pvCommand.Parameters.Add(new SqlParameter("@ContractNumber", contractNumber));

SqlParameter pvNewId = new SqlParameter();
pvNewId.ParameterName = "@NewId";
pvNewId.DbType = DbType.Int32;
pvNewId.Direction = ParameterDirection.Output;
pvCommand.Parameters.Add(pvNewId);

try
{
sqlRows = pvCommand.ExecuteNonQuery();

if (sqlRows > 0)
Debug.Print("New Id Inserted = ",
pvCommand.Parameters["@NewId"].Value.ToString());
}
catch (Exception e)
{
Debug.Print("Insert Exception Type: {0}", e.GetType());
Debug.Print(" Message: {0}", e.Message);
}
}

最佳答案

我稍微修改了您的存储过程(以使用 SCOPE_IDENTITY),它看起来像这样:

CREATE PROCEDURE usp_InsertContract
@ContractNumber varchar(7),
@NewId int OUTPUT
AS
BEGIN
INSERT INTO [dbo].[Contracts] (ContractNumber)
VALUES (@ContractNumber)

SELECT @NewId = SCOPE_IDENTITY()
END

我试过了,效果很好(使用修改后的存储过程):

// define connection and command, in using blocks to ensure disposal
using(SqlConnection conn = new SqlConnection(pvConnectionString ))
using(SqlCommand cmd = new SqlCommand("dbo.usp_InsertContract", conn))
{
cmd.CommandType = CommandType.StoredProcedure;

// set up the parameters
cmd.Parameters.Add("@ContractNumber", SqlDbType.VarChar, 7);
cmd.Parameters.Add("@NewId", SqlDbType.Int).Direction = ParameterDirection.Output;

// set parameter values
cmd.Parameters["@ContractNumber"].Value = contractNumber;

// open connection and execute stored procedure
conn.Open();
cmd.ExecuteNonQuery();

// read output value from @NewId
int contractID = Convert.ToInt32(cmd.Parameters["@NewId"].Value);
conn.Close();
}

这也适用于您的环境吗?我不能说为什么您的原始代码不起作用 - 但当我在这里执行此操作时,VS2010 和 SQL Server 2008 R2,它可以完美地工作....

如果您没有取回值 - 那么我怀疑您的表 Contracts 可能实际上没有包含 IDENTITY 属性的列。

关于c# - 在 C# 中使用存储过程输出参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10905782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com