如果存在则显示消息,如果不存在则执行其他操作 ASP

If Exists Display a Message, If not, do something else ASP

我是 C# 编程的新手,我一直在所有网站上进行研究,我找到了一个答案,这就是我正在搜索的答案,但目前我将其付诸实践,但它并没有没用。

问题是我有一个页面,你必须在其中输入你的用户编号和你的合同类型,这两个合并是一个关键 table,所以当你点击按钮时,如果用户table 中已经存在它需要显示消息 "The User Already Exists!" 否则它需要将数据发送到另一个页面。

这是我已有的代码:

protected void Button1_Click(object sender, EventArgs e)
{
        SqlConnection cn = new SqlConnection("Data Source=;Initial Catalog=Sales;User ID=;Password=");

        SqlCommand cmd = new System.Data.SqlClient.SqlCommand("CheckUserDataBase", cn);
        cmd.CommandType = CommandType.StoredProcedure; 

        SqlParameter parm = new SqlParameter("@User",SqlDbType.VarChar);
        parm.Value = "'" + EmployeeNo.Text + "" + ContractType.Text + "'";
        parm.Size=25;  
        parm.Direction = ParameterDirection.Input ;
        cmd.Parameters.Add(parm);

        SqlParameter parm2 = new SqlParameter("@Exists",SqlDbType.Int);
        parm2.Direction = ParameterDirection.Output;
        cmd.Parameters.Add(parm2); 

        cn.Open();
        cmd.ExecuteNonQuery();
        cn.Close();

        int IsExists = Convert.ToInt32(cmd.Parameters["@Exists"].Value.ToString());

        if (IsExists == 0)
        {
           Page.ClientScript.RegisterStartupScript(this.GetType(),"Scripts","<script>alert('The User already Exists!')</script>");
        }
        else if (IsExists == 1)
        {
            Response.Redirect("Data.aspx?NumEmp=" + EmployeeNumber+ "&ContractType=" + ContractType);
        }

这是我找到的存储过程:

ALTER PROCEDURE [dbo].[CheckUserDataBase]
    (@User AS VARCHAR(25),
     @Exists AS INT OUT)
AS 
BEGIN
    IF EXISTS (SELECT * 
               FROM GeneralData 
               WHERE EmployeeeNo+ContractType = @User)
    BEGIN
        SET @Exists = 1
    END
END 

我的代码的所有其他部分已经工作,但现在我陷入了 SQL 的验证阶段,非常感谢你的帮助。

此致!

我不清楚你的问题到底出在哪里,但我确实在这段代码中看到了几个问题。也许其中之一可以解决您的问题。

首先,在使用查询参数时,您不需要将参数值用单引号引起来。我还注意到这一行中的一个参数命名错误:

SqlParameter parm= new SqlParameter("@User, cn",SqlDbType.VarChar);

我们可以 select 记录计数并检查它,而不是使用输出参数,以获得更自然的查询并避免在 NULL 的情况下需要将结果转换为整数。

最后,我从存储过程中看到,您合并的两个字段实际上是 table 中的单独列。考虑到这一点,通过实际将两个字段作为单独的参数发送,您还将获得 MUCH 更好的性能。

这是说明这些更改的代码。我不得不猜测如何在两个字段之间划分 25 个字符:

ALTER PROCEDURE [dbo].[CheckUserDataBase]
 (
   @EmpNo AS VARCHAR(15), @ContractType AS VARCHAR(10)
 )
 AS 
 BEGIN
    select count(*) 
    from GeneralData 
    where EmployeeeNo = @EmpNo 
        AND ContractType= @ContractType
 END 

.

protected void Button1_Click(object sender, EventArgs e)
{
    int results = 0;
    using (var cn = new SqlConnection("Data Source=;Initial Catalog=Sales;User ID=;Password="))
    using (var cmd = new SqlCommand("CheckUserDataBase", cn))
    {
        cmd.CommandType=CommandType.StoredProcedure; 
        cmd.Parameters.Add("@EmpNo", SqlDbType.VarChar, 15).Value = EmployeeNo.Text;
        cmd.Parameters.Add("@ContractType", SqlDbType.VarChar, 10).Value = ContractType.Text;

        cn.Open();
        results = (int)cmd.ExecuteScalar();
    }
    if (results > 0)
    {
       Page.ClientScript.RegisterStartupScript(this.GetType(),"Scripts","<script>alert('The User already Exists!')</script>");
    }
    else
    {
        Response.Redirect(String.Format("Data.aspx?NumEmp={0}&ContractType={1}", 
          Server.UrlEncode(EmployeeNumber), Server.UrlEncode(ContractType)));
    }
}

根据你的暗示,我相信你的挣扎就是验证。在执行另一项任务之前确定所述数据是否存在。您可以通过多种方式做到这一点,但我相信您希望通过的方式是:

  • ExecuteScalar
  • SqlDataReader

所以在我的示例中,我将确定用户名是否已经存在。

private readonly string dbConnection = ...;
private const string validateUserQuery = "...;";

public bool ValidateUser(string user)
{
     using(var connection = new SqlConnection(dbConnection));
     using(var command = new SqlCommand(validateUserQuery, connection))
     {
          connection.Open();
          command.Parameters.Add("@User", SqlDbType.NVarChar, 50).Value = user;
          var result = command.ExecuteScalar() as string;

          if(!string.IsNullOrEmpty(result))
               return true;
     }

     return false;
}

所以在这种情况下,ExecuteScalar 应该 return 一个 string 作为用户名,如果失败它将使用 null。所以我们判断它是否存在,它会return为真。否则它 return 是假的。