我有一个非常简单的存储过程,它根据用户提供的ID选择记录。
ALTER PROCEDURE [dbo].[sp_getcheck]
@ID int
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
If NOT EXISTS(select * from mytable where ID=@ID)
BEGIN
RAISERROR (
'The ID you entered %d is invalid',
11,
1,
@ID);
END
END
我们想要做的是让用户输入一个ID并检查它是否存在于我们的数据库中。
如果是,用户将被重定向到他/她选择的页面。
如果不是,我们希望用户在同一屏幕上显示输入的ID号码Q1254无效的消息。
在存储过程中引发了该错误,我们希望C#代码在屏幕上为用户显示该消息。
以下是代码:
protected void chk_Click(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(accountnumber.Text))
{
SqlConnection Conn = default(SqlConnection);
//Read in connection String
Conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Constr"].ConnectionString);
Conn.Open();
SqlCommand cmd = new SqlCommand("sp_getcheck", Conn);
//Retrieve the value of the output parameter
//Add the output parameter to the command object
cmd.Parameters.AddWithValue("@ID", checknumber.Text);
SqlParameter outPutParameter = new SqlParameter();
SqlDataReader dr = cmd.ExecuteReader();
//Retrieve the value of the output parameter
if (dr.Read())
{
try
{
//we add a hidden field called IsValid to the markup and set the IsValid value in the event handler here.
imgstatus.ImageUrl = "images/Icon_Available.gif";
lblStatus.ForeColor = Color.Green;
//redirect based on value of hidden form field called evalue
var evalue = hequipID.Value;
if (evalue == "1")
{
Response.Redirect("Air.aspx?pageId=1");
}
if (evalue == "2")
{
Response.Redirect("Land.aspx?pageId=2");
}
//ID exists, get form fields and store db values in them:
//txtfname.Text = (dr["FullName"].ToString());
}
catch (SqlException ex)
{
//Something is wrong with this taxpayer's account.
imgstatus.ImageUrl = "images/NotAvailable.jpg";
lblStatus.ForeColor = Color.Red;
lblStatus.Text = ex.Message;
chk.BackColor = Color.Silver;
System.Threading.Thread.Sleep(2000);
}
}
}
}
当我尝试运行代码时,收到以下错误消息:
Procedure or function 'sp_getchech' expects parameter '@ID', which was not supplied
当然我做错了。
有任何想法如何解决这个问题?
引用的线程与我的不同。该线程缺少一些参数。
我没有遗漏任何参数,因此,不是引用线程的副本。
答案 0 :(得分:1)
看起来您可能会向存储过程发送空白,空或空ID。
您的代码会检查accountnumber.Text
是否为空或空,但您使用checknumber.Text
的值。
当然,如果您附加调试器并查看要发送到存储过程的值,则可以很容易地发现这一切。
答案 1 :(得分:1)
您永远不会告诉您的SqlCommand
这是关于调用存储过程 - 请执行以下操作:
SqlCommand cmd = new SqlCommand("sp_getcheck", Conn);
cmd.CommandType = CommandType.StoredProcedure;