1

我正在生成一个随机数入场号码,这是我的 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;
       }
   }

我正在检查是否生成了任何重复项,但是我收到一个错误,例如输入字符串的格式不正确?我在哪里做错了?还有比这更好的方法吗?

4

1 回答 1

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 个值。

希望这能给你很好的选择。如果您还有其他问题,请告诉我。

于 2012-10-10T19:25:22.187 回答