C# 无效的强制转换异常,没有重定向或警报

C# 无效的强制转换异常,没有重定向或警报,c#,asp.net,sql,C#,Asp.net,Sql,我有一个返回OutRes的SQL过程 protected void LoginButton_Click1(object sender, EventArgs e) { int Results = 0; using (SqlConnection sc1 = new SqlConnection()) { sc1.ConnectionString = "Data Source=localhost;Initial Catalog=Drug;Integrated Security=Tr

我有一个返回OutRes的SQL过程

protected void LoginButton_Click1(object sender, EventArgs e)
{
  int Results = 0;

  using (SqlConnection sc1 = new SqlConnection())
  {
    sc1.ConnectionString = "Data Source=localhost;Initial Catalog=Drug;Integrated Security=True";
    SqlCommand sqlcom = new SqlCommand("user_login",sc1);
    {
        sqlcom.CommandType = CommandType.StoredProcedure;
        sqlcom.Parameters.Add("@UsernameSP", SqlDbType.VarChar, 10).Value = this.txtUserName.Text.Trim();
        sqlcom.Parameters.Add("@PasswordSP", SqlDbType.VarChar, 10).Value = this.txtPwd.Text.Trim();
        sqlcom.Parameters.Add("@OutRes", SqlDbType.VarChar, 4);
        sqlcom.Parameters["@OutRes"].Direction = ParameterDirection.Output;
        sqlcom.Connection = sc1;

        try
        {
            sc1.Open();
            sqlcom.ExecuteNonQuery();
            Results =(int)sqlcom.Parameters["@OutRes"].Value;
        }
        catch (SqlException ex)
        {
            ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('" + ex.Message + "')", true);
        }
        finally
        {
            sqlcom.Dispose();
            if (sc1 != null)
            {
                sc1.Close();
            }

        }
    } 
    if (Results == 0)
    ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('" + "result 0" + "')", true);
    else
     { 
     ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('" + "result 1" + "')", true);
     Response.Redirect("/DrugEntry.aspx");
     }
}
此处的强制转换异常无效:

结果=intsqlcom.Parameters[@OutRes].Value; 用户代码未处理System.InvalidCastException 消息=指定的强制转换无效

代码也不显示警报或重定向。发生了什么事

这不会显示出来。根据我的查询,结果变量存储为0或1

if (Results == 0)
    ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('" + "result 0" + "')", true);
else
{ ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('" + "result 1" + "')", true);
Response.Redirect("DrugEntry.aspx");
}
两个警报均不显示。知道为什么吗?

您将输出参数作为Varchar传递,并尝试在ExecuteNonQuery asInt之后进行转换`

若要将其强制转换为Int,则必须将其作为Int传递到参数中,并且在StoredProcess中也应该是Int

更改它,它将为您工作。

您将输出参数作为Varchar传递,并尝试在ExecuteOnQuery asInt之后进行转换`

若要将其强制转换为Int,则必须将其作为Int传递到参数中,并且在StoredProcess中也应该是Int

改变它,它将为你工作

尝试使用Convert.ToInt32sqlcom.Parameters[@OutRes].Value; 而不是铸造 您正在捕获SqlException,而引发的异常是InvalidCastException,这就是catch块没有捕获它的原因。 尝试使用Convert.ToInt32sqlcom.Parameters[@OutRes].Value; 而不是铸造 您正在捕获SqlException,而引发的异常是InvalidCastException,这就是catch块没有捕获它的原因。
您需要将@Outres参数的类型从Varchar更改为Int


您需要将@Outres参数的类型从Varchar更改为Int


从sqlcom.Parameters[@OutRes]中产生的任何内容。值不能强制转换为整数。您不会收到警报,因为异常不是SqlException类型。从sqlcom.Parameters[@OutRes]产生的任何内容.Value不能强制转换为整数。由于异常不是SqlException类型,因此不会收到警报。使用not Int.TryParsePERFECT会更安全一些!谢谢知道为什么没有弹出警报吗?将您的消息包装在脚本标记中,就像下面的警报消息一样,警报“+ex.message+”;您应该使用Exception来捕获任何错误,而不是SqlException。@MayankPathak谢谢您的帮助D@divinediu如果你感谢他,那么我认为这应该被接受为答案。不使用Int.TryParsePERFECT会更安全一点!谢谢知道为什么没有弹出警报吗?将您的消息包装在脚本标记中,就像下面的警报消息一样,警报“+ex.message+”;您应该使用Exception来捕获任何错误,而不是SqlException。@MayankPathak谢谢您的帮助D@divinediu如果你感谢他,那么我认为这应该被接受为答案。你不能确定它实际上是数据库中的一个整数。如果他这样做了,他应该首先将其存储为数据库中的一个数字,而不是varchar,因为它可能是数字。不管怎么说,关键是如果他在代码行的最后一行将其强制转换为整数,那么首先应该使用整数SQL类型,而不是varchar。虽然您确实说明了问题所在,但最好只显示您所做的更改,与其复制/粘贴整个代码并期望人们找到一行代码,不如确保它在数据库中实际上是一个整数。如果他这样做了,他应该首先将其存储为数据库中的一个数字,而不是varchar,因为它可能是数字。不管怎么说,关键是如果他在代码行的最后一行将其强制转换为整数,那么首先应该使用整数SQL类型,而不是varchar。虽然您确实说明了问题所在,但最好只显示您所做的更改,而不是复制/粘贴整个代码并期望人们找到一行
 Results =(int)sqlcom.Parameters["@OutRes"].Value;
protected void LoginButton_Click1(object sender, EventArgs e)
{
  int Results = 0;
  using (SqlConnection sc1 = new SqlConnection())
  {
      sc1.ConnectionString = "Data Source=localhost;Initial Catalog=Drug;Integrated Security=True";
      SqlCommand sqlcom = new SqlCommand("user_login",sc1);
      {
         sqlcom.CommandType = CommandType.StoredProcedure;
         sqlcom.Parameters.Add("@UsernameSP", SqlDbType.VarChar, 10).Value = this.txtUserName.Text.Trim();
         sqlcom.Parameters.Add("@PasswordSP", SqlDbType.VarChar, 10).Value = this.txtPwd.Text.Trim();
         sqlcom.Parameters.Add("@OutRes", SqlDbType.Int, 4);
         sqlcom.Parameters["@OutRes"].Direction = ParameterDirection.Output;
         sqlcom.Connection = sc1;

         try
         {
           sc1.Open();
           sqlcom.ExecuteNonQuery();
           Results =(int)sqlcom.Parameters["@OutRes"].Value;

         }
         catch (SqlException ex)
         {
              ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('" + ex.Message + "')", true);

         }
         finally
         {
            sqlcom.Dispose();
            if (sc1 != null)
            {
               sc1.Close();
            }

        }
    } 
    if (Results == 0)
       ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('" + "result 0" + "')", true);
    else
    { 
       ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage",   "alert('" + "result 1" + "')", true);
       Response.Redirect("/DrugEntry.aspx");
    }
 }