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

时间:2015-04-20 17:23:00

标签: c# asp.net stored-procedures

我是C#编程的新手,而且我一直在研究所有网站,我找到了一个答案,这是我正在搜索的答案,但此刻我把它付诸实践它没有用。

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

这是我已有的代码:

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的验证过程中,我将非常感谢您的帮助。

问候!

2 个答案:

答案 0 :(得分:1)

我不清楚问题究竟在哪里,但我确实在此代码中看到了几个问题。也许其中一个可以解决您的问题。

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

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

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

最后,我从存储过程中看到,您组合的两个字段实际上是表中的单独列。考虑到这一点,通过将两个字段实际发送为单独的参数,您还可以获得 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)));
    }
}

答案 1 :(得分:0)

根据您的暗示,我相信您的努力就是验证。在执行其他任务之前,确定是否存在所述数据。你可以通过多种方式实现这一目标,但我相信你的希望是:

  • 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应为用户名返回string,如果失败,则会使用null。所以我们确定它是否存在,它将返回true。否则返回false。