【问题标题】:SQL Server stored procedure return value, and using it in C#SQL Server 存储过程返回值,并在 C# 中使用它
【发布时间】:2014-03-31 04:00:06
【问题描述】:

我的应用程序允许用户向数据库添加新播放器。在添加新玩家之前,我想要一个存储过程来检查是否存在具有名字和姓氏的玩家。我希望存储过程返回一个bit 值、01。然后我的 C# 方法将返回此值,程序可以决定是否继续创建。

请注意,我已经从下面的代码中删除了一些常规验证,即字段是否为空,或者余额 TextBox 无效等。

我也知道在处理返回值时我可能使用了错误的数据类型。即int 而不是bool

运行此程序时,我收到一条错误消息,提示我的 SP 需要输入参数 @ReturnedValue

干杯

 Player newPlayer = new Player();
 newPlayer.PlayerID = Guid.NewGuid();
 newPlayer.FirstName = TextBoxFirstName.Text;
 newPlayer.LastName = TextBoxLastName.Text;
 newPlayer.Balance = Convert.ToDouble(TextBoxInitialCredit.Text);

var exists = newPlayer.CheckExists();

if (exists == 1)
{
     newPlayer.AddPlayer();
}

方法如下:

 public int CheckExists()
 {
     SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["Badminton"].ConnectionString);

     myConnection.Open();

     SqlCommand SqlCmd = new SqlCommand("CheckPlayerExists", myConnection);
     SqlCmd.CommandType = CommandType.StoredProcedure;

     SqlCmd.Parameters.Add("@FirstName", SqlDbType.NVarChar, 50).Value = FirstName;
     SqlCmd.Parameters.Add("@LastName", SqlDbType.NVarChar, 50).Value = LastName;
     SqlCmd.Parameters.Add("@ReturnValue", SqlDbType.Int, 2).Direction = ParameterDirection.Output;

     SqlDataAdapter myDataAdapter = new SqlDataAdapter(SqlCmd);
     DataSet myDataSet = new DataSet();
     myDataAdapter.Fill(myDataSet);

     int exists = Convert.ToInt32(SqlCmd.Parameters["@ReturnValue"].Value);

     myConnection.Close();

     return exists;
 }

现在是我的存储过程:

CREATE PROCEDURE dbo.CheckPlayerExists
   @firstName nvarchar(50),
   @lastName nvarchar(50),
   @ReturnValue bit output
AS 
BEGIN
IF EXISTS (SELECT * FROM Players WHERE FirstName = @firstName AND LastName = @lastName)
        SET @ReturnValue = 1
ELSE
        SET @ReturnValue = 0

RETURN @ReturnValue
END

【问题讨论】:

  • 你应该使用FirstName = @firstName OR LastName = @lastName
  • DataTable 会比 DataSet 简单。
  • 您不需要表、集合或适配器,因为输出中没有行,ExecuteNonQuery 是最简单的,请参阅stackoverflow.com/questions/5630002/…

标签: c# asp.net sql-server stored-procedures webforms


【解决方案1】:

首先,您发布的信息有些不一致。参数是@ReturnValue 还是@ReturnedValue?仅此一项就可能是问题所在。

其次,将@ReturnedValue参数的存储过程声明更改为

@ReturnValue bit = 0 output

或更改添加输出参数的 C# 代码:

SqlParameter p = new SqlParameter();
p.ParameterName = "@ReturnedValue";
p.SqlDbType = SqlDbType.Int;
p.Value = 0;
p.Direction = ParameterDirection.InputOutput;
SqlCmd.Parameters.Add(p);

【讨论】:

  • 谢谢 RBarry。在较早的答案之后,我仅将其从 atReturnValue 更改为 atReturnedValue 。我的原始代码很好。问题是你的第二个建议。我需要在 SP 内的参数声明中添加“= - 输出”。谢谢
【解决方案2】:

问题:您将ParameterDirection 枚举值分配为Output

解决方案:将您的 ParameterDirection 枚举值从 Output 更改为 ReturnValue

返回值: ParameterDirection.ReturnValue

参数表示一个操作的返回值,例如 存储过程、内置函数或用户定义函数。

替换这个:

SqlCmd.Parameters.Add("@ReturnValue", SqlDbType.Int, 2).Direction
   = ParameterDirection.Output;

有了这个:

SqlCmd.Parameters.Add("@ReturnValue", SqlDbType.Int, 2).Direction
   = ParameterDirection.ReturnValue;

【讨论】:

  • 谢谢,我已将它和 SP 更改为 @ReturnedValue,但是我收到此错误:过程或函数“CheckPlayerExists”需要参数“@ReturnedValue”,但未提供
  • @ManxJason:你改变了方向参数吗?
【解决方案3】:

我想我看到了你的问题。行内:

SqlCmd.Parameters.Add("@ReturnValue", SqlDbType.Int, 2).Direction = ParameterDirection.Output;

将名称和方向类型更改为:

SqlCmd.Parameters.Add("@ReturnedValue", SqlDbType.Int, 2).Direction = ParameterDirection.ReturnValue;

【讨论】:

  • 谢谢,我已将它和 SP 更改为 @ReturnedValue,但是我收到此错误:过程或函数“CheckPlayerExists”需要参数“@ReturnedValue”,但未提供。跨度>
  • 您是否将ParameterDirection.Output 更改为.ReturnValue
猜你喜欢
  • 1970-01-01
  • 2010-11-23
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多