检查随机数重复

时间:2012-10-10 18:46:00

标签: c# sql sql-server

我正在生成一个随机数录取号,这是我的DAL

 public static int randomgen()
   {
       int id=0;
       int number = r.Next(100);
       HttpContext.Current.Session["number"] = "SN" + (" ") + number.ToString();
       SqlConnection con = DBConnection.OpenConnection();
       try
       {
           string sql1 = "select admissionno from tblstudent_details";
           SqlCommand cmd=new SqlCommand(sql1,con);
           SqlDataReader dr = cmd.ExecuteReader();
           if (dr.Read())
          {
               id = Convert.ToInt32(dr[0]);

           }
            dr.Close();
           return id;
       }

       catch (Exception)
       {

           throw;
       }
   }

我正在检查是否有任何重复生成,但我收到错误,如输入字符串格式不正确?我做错了什么?有没有比这更好的方法?

1 个答案:

答案 0 :(得分:1)

你问是否有更好的方法......

根据我对该问题的理解,您要尝试的是选择一个随机值,然后检查数据库以查看该值是否已存在。您希望将值返回到UI以告知UI该值是否存在...

以下是几个可供考虑的替代方案......

public static bool randomgen() 
{
    bool isFound = false;
    string admissionNumber = "SN " + r.Next(100); 
    HttpContext.Current.Session["number"] = admissionNumber; 
    using (SqlConnection con = new SqlConnection()) // use "using" to guarantee connection is closed
    {
        string sql1 = "SELECT CASE WHEN EXISTS(SELECT admissionno FROM tlblstudent_details WHERE admissionno = @admissionno) THEN 1 ELSE 0 END";
        using (SqlCommand cmd = con.CreateCommand())
        {
             cmd.CommandText = sql;
             cmd.Parameters.AddWithValue("@admissionno", number);
             using (SqlDataReader dr = cmd.ExecuteReader())
             {
                 if (dr.Read())
                 {
                     isFound = (Convert.ToInt32(dr[0]) == 1)
                  }
              }
         }
     }
     return isFound;
}

这样,您可以让SQL Server检查该值是否存在。

另一种方法......

如果值不是唯一的,不确定是否需要提示用户,如果不是必需的话,我会考虑采用不同的方法;继续努力,直到找到一个独特的价值......就像这样...

public static int randomgen() 
{ 
    bool isFound = true;
    while (isFound)
    {
        string admissionNumber = "SN " + r.Next(100); 
        using (SqlConnection con = new SqlConnection()) // use "using" to guarantee connection is closed
        {
            string sql1 = "SELECT CASE WHEN EXISTS(SELECT admissionno FROM tlblstudent_details WHERE admissionno = @admissionno) THEN 1 ELSE 0 END";
            using (SqlCommand cmd = con.CreateCommand(sql1))
            {
                cmd.Parameters.AddWithValue("@admissionno", admissionNumber);
                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    if (dr.Read())
                    {
                        isFound = (Convert.ToInt32(dr[0]) == 1)
                     }
                 }
             }
        }
        return number;
    }

这会一直检查,直到返回唯一值。然后将该唯一值返回给调用方法。现在您从调用者设置HttpContent.Current会话,此方法的责任仅限 找到唯一的录取号码。第二种方法的缺点是,根据已经使用了多少值,可能需要很长时间才能找到唯一值,特别是考虑到您只允许100个值。

希望这给你提供了很好的选择。如果您还有其他问题,请与我们联系。