我的GetProduct()方法总是返回找不到产品,我不明白为什么!我连接到数据库,我正在尝试使用表单上的搜索框来搜索确切的产品代码,并返回代码,说明和价格。
确切说明: 将名为GetProduct的静态方法添加到ProductDB类。此方法应接收要检索的产品的产品代码,并应返回该产品的Product对象。如果找不到包含产品代码的产品,则此方法应返回null。将与数据库一起使用的代码放在try-catch语句的try块中,包括一个捕获块然后抛出发生的任何SqlException,并包含一个关闭连接的finally块。
这是我到目前为止所做的:
static Product product = new Product();
public static Product GetProduct(string code)
{
SqlConnection connection = Connection.GetConnection();
string select = @"SELECT ProductCode, Description, UnitPrice FROM Products WHERE ProductCode = @ProductCode";
SqlCommand selectCommand = new SqlCommand(select, connection);
SqlParameter pCode = new SqlParameter();
pCode.ParameterName = "@ProductCode";
pCode.Value = product.Code;
SqlParameter pDesc = new SqlParameter();
pDesc.ParameterName = "@Description";
pDesc.Value = product.Description;
SqlParameter pPrice = new SqlParameter();
pPrice.ParameterName = "@UnitPrice";
pPrice.Value = product.Price;
selectCommand.Parameters.AddWithValue("@ProductCode", code);
try
{
connection.Open();
SqlDataReader prodReader = selectCommand.ExecuteReader(CommandBehavior.SingleRow);
if (prodReader.Read())
{
product.Code = prodReader["ProductCode"].ToString(); ;
product.Description = prodReader["Description"].ToString();
product.Price = ((decimal)prodReader["UnitPrice"]);
return product;
}
else
{
return null;
}
}
这是frmProductSearch.cs
private void btnGetProduct_Click(object sender, EventArgs e)
{
if (Validator.IsPresent(txtCode))
{
this.GetProduct(txtCode.Text);
if (product == null)
{
MessageBox.Show("No product found with this code. " +
"Please try again.", "Product Not Found");
this.ClearControls();
}
else
this.DisplayProduct();
}
}
private void GetProduct(string code)
{
try
{
ProductDB.GetProduct(code); // Add a statement here to call the GetProduct method of the ProductDB class.
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.GetType().ToString());
}
}
答案 0 :(得分:0)
你应该摆脱你拥有的任何ProductDB
字段。我认为这可能会导致您感到困惑,因为您的frmProductSearch
课程和您的ProductDB
课程中的某个课程似乎引用了您的frmProductSearch
课程。如果是这种情况,那就可以解释为什么你得到null - 因为Product
类从不接触public static Product GetProduct(string code)
{
try
{
SqlConnection connection = Connection.GetConnection();
string select = @"SELECT ProductCode, Description, UnitPrice " +
"FROM Products WHERE ProductCode = @ProductCode";
SqlCommand selectCommand = new SqlCommand(select, connection);
selectCommand.Parameters.AddWithValue("@ProductCode", code);
connection.Open();
SqlDataReader prodReader =
selectCommand.ExecuteReader(CommandBehavior.SingleRow);
if (prodReader.Read())
{
return new Product
{
Code = prodReader["ProductCode"].ToString(),
Description = prodReader["Description"].ToString(),
Price = (decimal) prodReader["UnitPrice"]
};
}
else
{
return null;
}
}
catch (SqlException)
{
throw;
}
finally
{
connection.Close();
connection.Dispose();
}
}
类的静态字段(它不应该)。
您应该让所有方法返回private Product GetProduct(string code)
{
// Add a statement here to call the GetProduct method of the ProductDB class.
return ProductDB.GetProduct(code);
}
,并让调用方法使用返回的值而不是依赖静态字段来更新。
因此,要稍微修改您的代码,您的'ProductDB'方法应该返回一个新产品:
DisplayProduct
您的表单方法现在可以直接使用此方法的返回值,并将其传递:
private void btnGetProduct_Click(object sender, EventArgs e)
{
if (Validator.IsPresent(txtCode))
{
Product product = this.GetProduct(txtCode.Text);
if (product == null)
{
MessageBox.Show("No product found with this code. Please try again.",
"Product Not Found");
this.ClearControls();
}
else
{
this.DisplayProduct(product);
}
}
}
最后,您可以使用其他表单方法使用返回的商品并将其传递给DisplayProduct
方法:
private static void DisplayProduct(Product product)
{
// Implementation here...
}
当然,这意味着您需要更新{{1}}方法以接受参数并使用该方法而不是静态字段:
{{1}}