3

在我的 winform 中,我试图通过传递项目的名称从数据库中获取项目的价格。用户可以在从数据库中填充项目的组合框中看到项目。当用户从组合框中选择项目并单击添加时,它将该特定项目添加到数据库中。

在用户添加商品的同时,其中一个文本框添加了价格。如果用户添加五个项目,则文本框显示五个项目价格的总和。到这里一切正常。

现在,当用户想要从列表框中删除该项目时,用户选择该项目并单击删除项目,Visual Studio 会抛出错误“索引超出范围”。

我使用相同的代码来获取 add 方法和 substract 方法的价格,但不知道为什么只有 add 方法有效而不是 substract

添加价格的代码

public int addPrice()
        {

            DataSet ds = searchforPrice(comboBox2.Text);
            int sum;
            bool success = int.TryParse(maskedTextBox10.Text, out sum);
            int price = Convert.ToInt32(ds.Tables[0].Rows[0]["Price"]);
            return sum + price;

        }

减价代码

 public int subPrice()
        {

            DataSet ds = searchforPrice(listBox1.GetItemText(listBox1.SelectedItem));
            int sum;
            bool success = int.TryParse(maskedTextBox10.Text, out sum);
            int price = Convert.ToInt32(ds.Tables[0].Rows[0]["Price"]);
            return sum - price;

        }

从数据库获取价格的代码

public DataSet searchforPrice(string itemName)
{
    DataSet dataSet = new DataSet();

    // Create connection object
    OleDbConnection oleConn = new OleDbConnection(connString);
    try
    {
        oleConn.Open();
        string sql = "SELECT [Price]  FROM [Product] WHERE [Product Name] ='" + itemName + "'";
        OleDbDataAdapter dataAdapter = new OleDbDataAdapter(sql, oleConn);
        dataAdapter.Fill(dataSet, "Product");

    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
    finally
    {
        oleConn.Close();
    }
    return dataSet;
}

在此处输入图像描述

4

5 回答 5

1

结果集中没有表或没有行。这意味着访问第一个条目(索引 0)将不起作用,因为没有第一个条目。你得到一个IndexOutOfRangeException. 检查您的请求和数据源。

于 2013-02-21T13:37:10.320 回答
1

这是失败的,因为searchForPrice没有返回表中的任何行。因此错误

位置 0 处没有行。

因此,如果您更改该行以从列表框或表单上的其他位置获取值,这将返回数据,您的错误将得到修复。

真正的潜在问题是传递给searchForPrice.

于 2013-02-21T13:38:29.223 回答
0

提供的代码应该可以工作。

您需要检查实际数据源中的列是否与通过 ListBox 项传递的内容相匹配。在我看来,您的命名约定很可能存在差异。

如果通过 ListBox 传递的列名与数据源中的列名匹配,则以下代码应该可以工作:-

public int subPrice()
        {
            if (listBox1.SelectedItems.Count > 0)
            {
                string SearchString = listBox1.SelectedItem.ToString().Trim();
                DataSet ds = searchforPrice(SearchString);

                if (ds.Tables["Product"].Rows.Count > 0)
                {
                    bool success = int.TryParse(maskedTextBox10.Text, out sum);
                    int price = Convert.ToInt32(ds.Tables["Product"].Rows[0]["Price"]);
                    return sum - price;
                }                
            }

          return null;
        }
于 2013-02-21T15:00:49.063 回答
0

方法 searchforPrice 返回一个没有行的数据集。因此,Rows[0] 不存在。检查您的方法并使其适应 searchforPrice 未返回数据(未找到任何价格)的情况。

if (ds.Tables[0].Rows.Count != 0

{ ...}

于 2013-02-21T13:37:53.053 回答
0

问题是因为您的数据集返回 0 行。那是因为项目名称没有传递给 SQL 查询。您只需要对 subPrice() 函数进行细微更改,

public int subPrice()
        {

            DataSet ds = searchforPrice(listBox1.SelectedItem.ToString());
            int sum;
            bool success = int.TryParse(maskedTextBox10.Text, out sum);
            int price = Convert.ToInt32(ds.Tables[0].Rows[0]["Price"]);
            return sum - price;

        }
于 2013-02-21T13:44:38.783 回答