我正在生成一个随机数录取号,这是我的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;
}
}
我正在检查是否有任何重复生成,但我收到错误,如输入字符串格式不正确?我做错了什么?有没有比这更好的方法?
答案 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个值。
希望这给你提供了很好的选择。如果您还有其他问题,请与我们联系。