2017-12-13 3 views
0

申し込みフォームを作成しましたが、重複した名前を作成しようとしたときにそれができません。しかし、私は、ユーザー名がすでに取得されていることをユーザーに知らせて、それらを許可しません。それ、どうやったら出来るの?相続人は私が使用するコード :複製アイテムがデータベースに追加しようとしたときにエラーを受け入れる

SqlConnection con = new SqlConnection(@"NOTSHOWING"); 
    SqlCommand cmd = new SqlCommand("insert into Schools(Username,Password,Security,SecurityQuestion) values ('" + bunifuMaterialTextbox1.Text + "','" + bunifuMaterialTextbox2.Text + "','" + bunifuMaterialTextbox3.Text + "','" + bunifuDropdown1.selectedValue + "')", con); 
    Form5 ss = new Form5(); 
    ss.Show(); 
    Thread.Sleep(5000); 
    con.Open(); 
    cmd.ExecuteNonQuery(); 
    con.Close(); 

そして、私が取得エラー:

System.Data.SqlClient.SqlException: 'Violation of PRIMARY KEY constraint 
'NOTSHOWING'. Cannot insert duplicate key in object 'dbo.Schools'. The 
duplicate key value is (NAME). 
The statement has been terminated.' 

そしてまた、私は試してみて、複数のブロックをキャッチすることができますか?いいね:

try 
{ 

} 
catch 
{ 

} 
try 
{ 

} 
catch 
{ 

} 
+2

ロジックとして例外をトラップするのは一般的に設計が貧弱です。私は、存在しない場合はユーザーを挿入し、成功を判断するためにリターンコードを使用するストアドプロシージャを記述します。 – Crowcoder

+1

Crowcoderは、通常の状況下で発生すると予想されるものに例外を頼ってはならないというのは当然です。ストアドプロシージャを使用するのではなく、データベースにクエリを発行して、その名前のユーザーが存在するかどうかを判断し、一致するユーザーがない場合にのみINSERTを実行します。 – StriplingWarrior

+2

常にSQLインジェクションを避けるためにパラメータを使用してください。その表示フォームとスリープコールを取り除く、それはあなたのコードをブロックし、ユーザーを悩ます。 – LarsTech

答えて

0

例外をキャッチして、それをユーザーに伝播させるのではなく、応答を生成する必要があります。

これは、ExecuteNonQuery呼び出しを試してみることを意味し、どのような方法で結果ページを操作しても意味があります(私はDB質問に答えることができますが、Web部分の操作方法は教えていません)。

0

try/catchブロックや何らかの形の例外処理を使用する必要があるようです。例:try SQL文を実行するには、例外が発生した場合、catchコードブロックが有効になります。キャッチブロックでは、ユーザーにその正確なsqlexceptionに基づいて間違っていることを通知できます。

この目的は、例外が発生する代わりにプログラムを実行し続けることです。これは特に、あなたのコードに適用されますが、それはこの構文的に類似したどのように見えるかもわからない:

catch (SqlException ex) 
{ 
    if (ex.Number == 2627) 
    { 
     //Violation of primary key. Handle Exception 
    } 
    else throw; 
} 

MSSQL_ENG002627

それとも場合:

try 
{ 
    SqlConnection con = new SqlConnection(@"NOTSHOWING"); 
    SqlCommand cmd = new SqlCommand("insert into Schools(Username,Password,Security,SecurityQuestion) values ('" + bunifuMaterialTextbox1.Text + "','" + bunifuMaterialTextbox2.Text + "','" + bunifuMaterialTextbox3.Text + "','" + bunifuDropdown1.selectedValue + "')", con); 
    Form5 ss = new Form5(); 
    ss.Show(); 
    Thread.Sleep(5000); 
    con.Open(); 
    cmd.ExecuteNonQuery(); 
    con.Close(); 

} 
catch //can have() here to tell exception expected 
{ 
    //Inform user or other logic down here continuing the program if there was an exception 
    Console.WriteLine("Exception occured.. continuing.."); 
    //MyLabel.Text = "INVALID"; 
} 

また、あなたはこのような何かを行うことができます複数のものをキャッチしたい場合は、次のようにキャッチしようとします:

try 
    { 
     // ... 
     throw new InvalidOperationException(
     "Arbitrary exception"); 
     // ... 
    } 
    catch(System.Web.HttpException exception) 
    when(exception.GetHttpCode() == 400) 
    { 
    // Handle System.Web.HttpException where 
    // exception.GetHttpCode() is 400. 
    } 
    catch (InvalidOperationException exception) 
    { 
    bool exceptionHandled=false; 
    // Handle InvalidOperationException 
    // ... 
    if(!exceptionHandled) 
     // In C# 6.0, replace this with an exception condition 
    { 
     throw; 
    } 
    } 

図のようにMark Michaelis

最後に、ロジックを駆動するための例外処理を使用することは、戦略的に賢明でない選択肢になる可能性があります。 LarsTech .. @ Crowcoderのコメントです。)

関連する問題