【发布时间】:2014-03-31 04:00:06
【问题描述】:
我的应用程序允许用户向数据库添加新播放器。在添加新玩家之前,我想要一个存储过程来检查是否存在具有名字和姓氏的玩家。我希望存储过程返回一个bit 值、0 或1。然后我的 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