C# 无效的强制转换异常,没有重定向或警报
我有一个返回OutRes的SQL过程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
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");
}
}