GetProduct(字符串代码)方法始终返回未找到的产品

时间:2018-05-02 22:26:22

标签: c# ado.net

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

1 个答案:

答案 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}}