Мои данные не сохранятся в моей базе данных. Вместо того, чтобы переходить к «Продукт был добавлен», он переходит к «Идентификатор продукта уже существует», хотя это не так. Вот код:

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

Что-то не так?

1
Albert 1 Дек 2017 в 15:10

1 ответ

Лучший ответ

У вас есть проблема с копией и вставкой:

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

Вместо этого должно быть:

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

Кстати, не используйте Catch для закрытия соединения. Вместо этого я настоятельно рекомендую использовать оператор 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;
}
1
Tim Schmelter 1 Дек 2017 в 12:51