Поймать исключение в C # - PullRequest
2 голосов
/ 22 февраля 2011

У меня есть простая кнопка ДОБАВИТЬ

И код ADD_Click:

protected void Add_Click(object sender, EventArgs e)
    {
        string strConnectionString = ConfigurationManager.ConnectionStrings["SqlServerCstr"].ConnectionString;

        SqlConnection myConnection = new SqlConnection(strConnectionString);
        myConnection.Open();


        string hesap = Label1.Text;
        string musteriadi = DropDownList1.SelectedItem.Value;
        string avukat = DropDownList2.SelectedItem.Value;

        SqlCommand cmd = new SqlCommand("INSERT INTO AVUKAT VALUES (@MUSTERI, @AVUKAT, @HESAP)", myConnection);

        cmd.Parameters.AddWithValue("@HESAP", hesap);
        cmd.Parameters.AddWithValue("@MUSTERI", musteriadi);
        cmd.Parameters.AddWithValue("@AVUKAT", avukat);
        cmd.Connection = myConnection;



        SqlDataReader dr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
        Response.Redirect(Request.Url.ToString());
        myConnection.Close();
    }

Что я хочу, если кто-нибудь добавляет данные с таким же HESAP (первичный ключ), который я хочуфункция alert () с этими словами.«Уже есть такие же данные» или любые слова.Не имеет значения

Как я могу это сделать?

ПРИМЕЧАНИЕ : Я хочу, чтобы одно и то же значение HESAP получало и улавливало ошибку.

Ответы [ 5 ]

5 голосов
/ 01 марта 2011

Попробуйте это:

protected void Add_Click(object sender, EventArgs e)
{
    string hesap = Label1.Text;
    string musteriadi = DropDownList1.SelectedItem.Value;
    string avukat = DropDownList2.SelectedItem.Value;

    string strConnectionString = ConfigurationManager.ConnectionStrings["SqlServerCstr"].ConnectionString;

    using (SqlConnection myConnection = new SqlConnection(strConnectionString))
    {
        myConnection.Open();

        using (SqlCommand cmd = new SqlCommand("INSERT INTO AVUKAT VALUES (@MUSTERI, @AVUKAT, @HESAP)", myConnection))
        {
            cmd.Parameters.AddWithValue("@HESAP", hesap);
            cmd.Parameters.AddWithValue("@MUSTERI", musteriadi);
            cmd.Parameters.AddWithValue("@AVUKAT", avukat);
            cmd.Connection = myConnection;

            try
            {
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                if (ex.Number == 2627)
                {
                    // Add a javascript alert to let the user know that the same HESAP value already exists.
                }
                else
                {
                    // Rethrow the exception.
                    throw;
                }
            }
        }
        Response.Redirect(Request.Url.ToString());
        myConnection.Close();
    }
}
4 голосов
/ 22 февраля 2011

Вы можете либо сначала добавить другой запрос, который проверяет, существует ли ключ, с помощью простого оператора select, либо вы можете (более уродливое решение imo) попытаться / поймать исключение SqlException, которое ExecuteReader сгенерирует в случае нарушения первичного ключа.

2 голосов
/ 22 февраля 2011

Я предполагаю, что база данных будет иметь несколько одновременных пользователей.

Я бы рекомендовал сделать попытку / поймать SQLException для нарушения первичного ключа, как упомянул Андреас. Я бы посоветовал сделать два запроса, потому что поток приложений (от отдельных пользователей) может быть следующим:

  • Пользователь А проверяет, используется ли ключ «А».
  • Пользователь Б проверяет, используется ли ключ «А». (Оба они в этот момент говорят нет)
  • Пользователь A вставляет клавишу «A».
  • Пользователь B вставляет клавишу «B». Это приведет к ошибке и вызовет исключение SQLEx для нарушения первичного ключа.
1 голос
/ 24 февраля 2011

Хотя есть несколько улучшений, которые можно и нужно сделать в исходном коде, опубликованном, как отмечено другими пользователями (с помощью операторов, ExecuteNonQuery и т. Д.), Если все, что вы хотите сделать, это обнаружить нарушения ограничений первичного ключа, то вы можете проверить ошибкуномер SqlException в блоке перехвата.Номер ошибки будет 2627. Используя существующий код, он будет выглядеть следующим образом ...

try
{
    string strConnectionString = ConfigurationManager.ConnectionStrings["SqlServerCstr"].ConnectionString;

    SqlConnection myConnection = new SqlConnection(strConnectionString);
    myConnection.Open();


    string hesap = Label1.Text;
    string musteriadi = DropDownList1.SelectedItem.Value;
    string avukat = DropDownList2.SelectedItem.Value;

    SqlCommand cmd = new SqlCommand("INSERT INTO AVUKAT VALUES (@MUSTERI, @AVUKAT, @HESAP)", myConnection);

    cmd.Parameters.AddWithValue("@HESAP", hesap);
    cmd.Parameters.AddWithValue("@MUSTERI", musteriadi);
    cmd.Parameters.AddWithValue("@AVUKAT", avukat);
    cmd.Connection = myConnection;



    SqlDataReader dr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
    Response.Redirect(Request.Url.ToString());
    myConnection.Close();
}
catch (SqlException ex)
{
    if (ex.Number == 2627)
    {
        // Add a javascript alert to let the user know that the same HESAP value already exists.
    }
    else
    {
        // Rethrow the exception.
        throw;
    }
}
1 голос
/ 22 февраля 2011
try
{
//open connection
//Insert
}
catch(SQLException Excep)
{
//If primary key violation alert()
}
finally
{
//Close connection
}

это может помочь вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...