你问有没有更好的方法...
根据我对这个问题的理解,您尝试做的是选择一个随机值,然后检查数据库以查看该值是否已经存在。您想将一个值返回给 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 个值。
希望这能给你很好的选择。如果您还有其他问题,请告诉我。