C# 自定义验证器总是检索true,即使它不是
C代码:C# 自定义验证器总是检索true,即使它不是,c#,sql-server,C#,Sql Server,C代码: string str = "Data Source=(LocalDB)\\MSSQLLocalDB;"; str += "AttachDbFilename=|DataDirectory|DinoData.mdf;"; str += "Integrated Security= True"; SqlConnection c; c = new SqlConnection(str); SqlCommand Cdd = new SqlCommand("SELECT COUNT(*) FROM
string str = "Data Source=(LocalDB)\\MSSQLLocalDB;";
str += "AttachDbFilename=|DataDirectory|DinoData.mdf;";
str += "Integrated Security= True";
SqlConnection c;
c = new SqlConnection(str);
SqlCommand Cdd = new SqlCommand("SELECT COUNT(*) FROM [User] WHERE UserName LIKE @Username;", c);
Cdd.Parameters.AddWithValue("@Username", txtuser.Text);
c.Open();
int NameExist = (int)Cdd.ExecuteScalar();
c.Close();
if (NameExist > 0)
{
CVName.IsValid = true;
if ((bool)Session["Conect"])
{
SqlCommand getlev = new SqlCommand("SELECT level FROM [User] WHERE Username like @user", c);
getlev.Parameters.AddWithValue("@user", txtuser.Text);
c.Open();
int a = (int)getlev.ExecuteScalar();
c.Close();
if (a>5)
{
CVSemi.IsValid = false;
if (a >= 10)
{
CVmax.IsValid = false;
}
else
CVmax.IsValid = true;
}
else
{
CVSemi.IsValid = true;
}
}
}
else
{
CVName.IsValid = false;
txtuser.CssClass = "err";
}
if (Page.IsValid)
{
/*Something happen*/
}
验证器CVmax始终为true
即使我将if转到:
如果a>=1
我更新了代码CVmax总是有效的为什么??
我尝试做每一件事,但都没有成功请帮助我使用了ORM以外的其他工具,但我提出了以下建议: 1查看您如何处理ExecuteScalar响应,请参见[此处]: 2由于在这里可能出现空响应,ExecuteScalar的装箱是否强制执行0响应
int a = (int)getlev.ExecuteScalar();
还是应该如此
int? a = (int?)getlev.ExecuteScalar();
if (a != null)
{
if (a==0) {CVmax.IsValid = false;}
}
else
{
CVmax.IsValid = false
}
我肯定会运行调试器,但你确定它不会跳过第二个if吗 正如@DavidG所说,您的代码格式很差。在组织了一点之后,你的一些“如果”看起来甚至没有击中目标。在您提供的代码段中,NameExist>0位没有替代项,因此只需输入正确的用户名
因此,坦率地说,废弃代码,重新开始使用正确的格式和使用。您至少可以正确地格式化代码吗?如果控件进入a>=10,您是否调试过?必须向CVmax提供什么初始值?即使我将if设置为:if a>=1,验证器CVmax也始终为true:如果a>=1,当您在调试器中单步执行代码时,a具有什么值?请将您的问题放在一边,您确实需要了解C代码是如何编写的。您缺少使用语句,并且您初始化/命名对象的方式显示您缺乏知识。你有没有试过看看数据库到底有什么价值?旁注:出于对非托管资源的热爱,请对IDisposable的东西使用using语句。如果带有ExecuteScalar的行出于任何原因引发异常,连接将永远不会关闭。不,不,不!不要建议使用这样的SQL—它极易受到SQL注入攻击。如果使用“%”++@user++“%”作为like,则like用户可以输入一个通用的单个字符(例如a),它会根据用户数据库的大小找到许多匹配项。不起作用,非常危险。删除建议
if (NameExist > 0) {
CVName.IsValid = true; // here you set the value to true.
// supposing this if doesn't trigger, CVmax will stay true.
if ((bool)Session["Conect"])
{
SqlCommand getlev = new SqlCommand("SELECT level FROM [User] WHERE Username like @user", c);
getlev.Parameters.AddWithValue("@user", txtuser.Text);
c.Open();
int a = (int)getlev.ExecuteScalar();
c.Close();
if (a>5){
CVSemi.IsValid = false;
if (a >= 10) {
CVmax.IsValid = false;
}
else {
CVmax.IsValid = true;
}
else
{
CVSemi.IsValid = true;
}
else
{
CVName.IsValid = false;
txtuser.CssClass = "err";
}