簡體   English   中英

在C#中捕獲異常

[英]Catching an Exception in C#

我有一個簡單的按鈕ADD

而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值並捕獲錯誤。

嘗試這個:

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();
    }
}

您可以先添加另一個查詢,使用簡單的select語句檢查密鑰是否存在,或者您可以(uglier solution imo)嘗試/捕獲如果存在主鍵沖突,ExecuteReader將拋出的SqlException。

我假設數據庫將同時擁有多個用戶。

正如安德烈亞斯所提到的,我建議對SQLException執行try / catch以獲取主鍵沖突。 我會建議兩個查詢,因為應用程序流(來自不同的用戶)可能如下所示:

  • 用戶A檢查是否使用了密鑰“A”。
  • 用戶B檢查是否使用了密鑰“A”。 (此時他們兩個都說不)
  • 用戶A插入密鑰“A”。
  • 用戶B插入鍵“B”。 這將失敗並導致主鍵沖突的SQLException。
try
{
//open connection
//Insert
}
catch(SQLException Excep)
{
//If primary key violation alert()
}
finally
{
//Close connection
}

這可能對你有幫助

雖然可以而且應該對其他用戶所指出的原始代碼(使用語句,ExecuteNonQuery等)進行一些改進,如果您只想檢測主鍵約束違規,那么您可以檢查錯誤編號。 catch塊中的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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM