2017-12-01 2 views
1

내 데이터가 내 데이터베이스에 저장되지 않습니다. '제품이 추가되었습니다'로 이동하는 대신 '제품 ID가 이미 존재합니다'로 이동합니다.C# - 데이터가 내 데이터베이스에 저장되지 않습니다

private void btnAddProduct_Click(object sender, EventArgs e) 
    { 
     if(txtNewProductID.Text == "" || txtNewProductName.Text == "" || txtNewProductPrice.Text == "" || cboNewProductCategory.Text == "") 
     { 
      MessageBox.Show("Please fill up the form!", "Message", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
     } 

     else 
     { 
      int prodQty = Convert.ToInt32(txtNewProductQuantity.Text); 
      decimal prodPrice = Convert.ToDecimal(txtNewProductPrice.Text); 

      if (!myData.AddProducts(txtNewProductID.Text, txtNewProductName.Text, prodQty, prodPrice, cboNewProductCategory.Text)) 
      { 
       MessageBox.Show("Product has been added!", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information); 
      } 

      else 
      { 
       if (MessageBox.Show("Product ID already exist", "Message", MessageBoxButtons.RetryCancel, MessageBoxIcon.Warning) == DialogResult.Retry) 
       { 
        txtNewProductID.Clear(); 
        txtNewProductName.Clear(); 
        txtNewProductPrice.Clear(); 
        txtNewProductQuantity.Clear(); 
       } 
      } 
     } 
    } 

이 내 클래스 라이브러리에서 코드입니다 :

public bool AddProducts(string productID, string productName, int productQuantity, decimal productPrice, string productCategory) 
    { 
     bool recordFound = false; 
     myCon.Open(); 

     try 
     { 
      SqlCommand saveProduct = new SqlCommand("AddProduct", myCon); 
      saveProduct.CommandType = CommandType.StoredProcedure; 
      saveProduct.Parameters.Add("@ProductID", SqlDbType.NVarChar).Value = productID; 
      saveProduct.Parameters.Add("@ProductName", SqlDbType.VarChar).Value = productName; 
      saveProduct.Parameters.Add("@ProductName", SqlDbType.Int).Value = productQuantity; 
      saveProduct.Parameters.Add("@ProductPrice", SqlDbType.Decimal).Value = productPrice; 
      saveProduct.Parameters.Add("@ProductCategory", SqlDbType.NVarChar).Value = productCategory; 
      saveProduct.ExecuteNonQuery(); 
      myCon.Close(); 
     } 
     catch 
     { 
      myCon.Close(); 
      recordFound = true; 
     } 

     return recordFound; 
    } 

가 그리고 이것은 내 저장 프로 시저에서이다 : 그것은 잘못 아무것도

CREATE PROCEDURE [dbo].[AddProduct] 
@ProductID nvarchar(50), 
@ProductName varchar(50), 
@ProductQuantity int, 
@ProductPrice decimal(18,2), 
@ProductCategory nvarchar(50) 
AS 
INSERT INTO ProductsTbl 
VALUES (@ProductID, @ProductName, @ProductQuantity, @ProductPrice, @ProductCategory) 
RETURN 0 

거기에 여기 코드는? 연결을 닫습니다 Catch를 사용하지 않는, 그런데

saveProduct.Parameters.Add("@ProductName", SqlDbType.VarChar).Value = productName; 
saveProduct.Parameters.Add("@ProductQuantity", SqlDbType.Int).Value = productQuantity; 

:

saveProduct.Parameters.Add("@ProductName", SqlDbType.VarChar).Value = productName; 
saveProduct.Parameters.Add("@ProductName", SqlDbType.Int).Value = productQuantity; 

가 대신이어야합니다 :

+2

참고 : 지금처럼 예외를 삼가 지 마십시오! –

+0

@TimSchmelter의 대답에 설명 된 것처럼이 오류는 오타입니다. –

답변

1

당신은 여기에 복사 붙여 넣기 문제가 있습니다. 대신 연결 및 명령에 using- 문구를 사용하는 것이 좋습니다. 이 방법이 끝날 때마다 연결이 닫혀 있는지 확인하십시오. con.Close은 실제 연결을 닫지 않지만 연결 풀에 다른 곳에서 사용할 준비가되었음을 알려줍니다. 그렇지 않으면 새로운 연결을 열어야 할 때마다 차단해야합니다.

public bool AddProducts(string productID, string productName, int productQuantity, decimal productPrice, string productCategory) 
{ 
    bool recordFound = false; 

    try 
    { 
     using (var myCon = new SqlConnection("Connection-String from config-file")) 
     using (var saveProduct = new SqlCommand("AddProduct", myCon)) 
     { 
      saveProduct.CommandType = CommandType.StoredProcedure; 
      saveProduct.Parameters.Add("@ProductID", SqlDbType.NVarChar).Value = productID; 
      saveProduct.Parameters.Add("@ProductName", SqlDbType.VarChar).Value = productName; 
      saveProduct.Parameters.Add("@ProductQuantity", SqlDbType.Int).Value = productQuantity; 
      saveProduct.Parameters.Add("@ProductPrice", SqlDbType.Decimal).Value = productPrice; 
      saveProduct.Parameters.Add("@ProductCategory", SqlDbType.NVarChar).Value = productCategory; 
      myCon.Open(); // will be closed implicitely at the end of the using 
      saveProduct.ExecuteNonQuery(); 
     } 
    } 
    catch (SqlException ex) when (new[] {2627, 2601}.Contains(ex.ErrorCode)) 
    { 
     // index constraint 
     recordFound = true; 
    } 
    catch(Exception otherExceptions) 
    { 
     // log this! 
     throw; // don't ignore it 
    } 

    return recordFound; 
} 
+0

감사합니다. 나는 너무 부주의했다. Btw, 추가 정보를 주셔서 감사합니다, 그것을 구현하려고합니다. – Albert

+0

@Albert : 천만에요. 추가로'Catch (SqlException)'을 발견 했습니까? 인덱스 제약 조건 위반으로 모든 예외를 처리하는 것보다 훨씬 나은 접근법입니다. –

+0

그래, 나는 그것을 알아 차렸다. 그래서 기본적으로 다른 '캐치 (catch)'는 예외를위한 것이고 다른 하나는 당신의 사용을위한 것입니다. 두 가지 유형의 예외를 모두 표시하기 위해 'catch'를 사용할 수도 있습니다. – Albert

관련 문제