我的数据不会保存在我的数据库中。而不是进入"产品已被添加",它转到"产品ID已经存在"即使它没有。这是代码:
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
它有什么问题吗?
答案 0 :(得分: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;
}