3

私のプロジェクトでは、クライアント名を主キーとして設定しました。同じ値を入力すると例外が発生します。今度は検証を書きたいと思います。つまり、主キーの値を再入力すると、「データは既に存在します", それを行うのを手伝ってください, 値を挿入するために使用しているコードは次のとおりです:

      private void btnInsert_Click(object sender, EventArgs e)
       {
        if (txtName.Text == string.Empty)
        {
            MessageBox.Show("Please enter a value to Project Name!");
            txtName.Focus();
            return;
        }
        if (txtContactPerson.Text == string.Empty)
        {
            MessageBox.Show("Please enter a value to Description!");
            txtContactPerson.Focus();
            return;
        }
        SqlConnection con = Helper.getconnection();
        con.Open();
        string commandText = "InsertClient";
        SqlCommand cmd = new SqlCommand(commandText, con);
        cmd.Parameters.AddWithValue("@Name", txtName.Text);
        cmd.Parameters.AddWithValue("@ContactPerson", txtContactPerson.Text);
        cmd.CommandType = CommandType.StoredProcedure;
        MessageBox.Show("Client details are inserted successfully");
        txtName.Clear();
        txtContactPerson.Clear();
        object Name = cmd.ExecuteNonQuery();
        con.Close();
        BindData();            
    }
4

4 に答える 4

3

ユーザーが表面的に有効な主キーを入力しようとすることを許可する傾向があります。それが重複している場合は、キャッチしてユーザーに表示できる例外があります。

この理由は、既存のキーについてデータベースをチェックする必要があるため、キーを挿入してエラーを処理することでこれを行うこともできます。

おそらく、検証とエラー処理をさらに改善することができます。個々の問題ごとにメッセージ ボックスをポップアップ表示するのは煩わしく、すべての問題の概要を表示することをお勧めします。また、メッセージ ボックスを表示している間、データベース接続を開いたままにしておくことも、おそらくお勧めできません。

private void btnInsert_Click(object sender, EventArgs e)
   {
    if (txtName.Text == string.Empty)
    {
        MessageBox.Show("Please enter a value to Project Name!");
        txtName.Focus();
        return;
    }
    if (txtContactPerson.Text == string.Empty)
    {
        MessageBox.Show("Please enter a value to Description!");
        txtContactPerson.Focus();
        return;
    }
    SqlConnection con = Helper.getconnection();
    con.Open();
    string commandText = "InsertClient";
    SqlCommand cmd = new SqlCommand(commandText, con);
    cmd.Parameters.AddWithValue("@Name", txtName.Text);
    cmd.Parameters.AddWithValue("@ContactPerson", txtContactPerson.Text);
    cmd.CommandType = CommandType.StoredProcedure;

try
{
    object Name = cmd.ExecuteNonQuery();
    MessageBox.Show("Client details are inserted successfully");
    txtName.Clear();
    txtContactPerson.Clear();
    BindData();
}
catch(Exception ex)
{
        //Handle exception, Inform User
}
finally
{
        con.Close();
}      
}
于 2013-09-19T09:34:45.310 に答える
2

私はあなたの要件を理解しています。例外の代わりに独自のコードを使用することについて質問しているようです。try catch ブロックを使用して取得できます。次のコードを試してください。

try
{
    object Name = cmd.ExecuteNonQuery();
    MessageBox.Show("Client details are inserted successfully");
    txtName.Clear();
    txtContactPerson.Clear();
    BindData();
}
catch(Exception ex)
{
    //Handle exception, Inform User
}
finally
{
    con.Close();
}      
于 2013-10-01T05:52:39.200 に答える
2

まず、一意のインデックスまたは制約を使用して、テーブルで重複が発生するのを防ぐことができます。インデックス/制約は、以下の提案と連携して機能します。一意のインデックスのみを使用し、以下の解決策のいずれも使用しない場合、重複レコードを挿入するとエラーがスローされ、反対側でそれを処理する必要があります。

レコードの存在を確認し、手動で挿入または更新できます。

create procedure MyProcedure
(
    @Name nvarchar(100),
    ...
)
as

    if not exists (select * from MyTable where Name = @Name)
    begin
        insert into MyTable (Name,...) values (@Name,...)
    end
    else
    begin
            update MyTable
            set ...
            where Name = @Name
    end
于 2013-09-19T09:44:13.313 に答える