何か良い方法はないかと聞かれた...
質問について私が理解していることから、あなたがしようとしていることは、ランダムな値を選択し、データベースをチェックして、その値が既に存在するかどうかを確認することです。値を 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 セッションを設定し、このメソッドの責任は一意の入場番号の検索のみに任せます。2 番目のアプローチの欠点は、特に 100 個の値しか許可していないことを考えると、既に使用されている値の数によっては、一意の値を見つけるのに時間がかかることです。
これにより、検討すべき良い選択肢が得られることを願っています。他にご不明な点がありましたらお知らせください。