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 セッションを設定し、このメソッドの責任は一意の入場番号の検索のみに任せます。2 番目のアプローチの欠点は、特に 100 個の値しか許可していないことを考えると、既に使用されている値の数によっては、一意の値を見つけるのに時間がかかることです。

これにより、検討すべき良い選択肢が得られることを願っています。他にご不明な点がありましたらお知らせください。

于 2012-10-10T19:25:22.187 に答える