首页 > 解决方案 > 如何使用 If 检查 SqlParameter 是否为真

问题描述

我想在这样的 if 语句上检查 sqlparameter 是否为真;

        string sql1 = "SELECT * FROM users WHERE mail=@mail and passwd is null";
        string sql2 = "SELECT * FROM users WHERE mail=@mail and passwd=@password";
        SqlParameter prm1 = new SqlParameter("mail", txtMail.Text.Trim());
        SqlParameter prm2 = new SqlParameter("password", txtPassword.Text.Trim());
        if (sql1 == true)
        {
           
            MessageBox.Show("yes");
        }
        else if (sql2 == true)
        {
            MessageBox.Show("yes2");
        }
        {
            MessageBox.Show("no");
        }

标签: c#sql-servertsql

解决方案


目前还不清楚您要做什么,但看起来您可能想要这样的代码:

const string query = @"
SELECT CASE WHEN passwdHash is null THEN 1 ELSE 2 END
FROM users
WHERE mail = @mail and (passwdHash is null OR passwdHash = @passwdHash);
";
using (var conn = new SqlConnection(yourConnString))
using (var comm = new SqlCommand(query, conn))
{
    comm.Parameters.Add("@mail", SqlDbType.VarChar, 200).Value = txtMail.Text.Trim();
    comm.Parameters.Add("@passwordHash", SqlDbType.Binary, 32) = SaltAndHashPassword(txtPassword.Text.Trim());
    conn.Open();
    var result = comm.ExecuteScalar() as int?;
    conn.Close();
    if (result == 1)
    {
        MessageBox.Show("yes");
    }
    else if (result == 2)
    {
        MessageBox.Show("yes2");
    }
    else
    {
        MessageBox.Show("no");
    }
}

请注意以下事项

  • using所有Sql对象上的块
  • 明确指定参数类型和长度
  • 散列密码并进行比较
  • 不要select *,只传回一个带有结果的列
  • 在阻塞之前关闭连接MessageBox

推荐阅读