数据集显示意外数据

时间:2013-07-21 06:00:22

标签: c# dataset

我有2 ListBoxes和5 textBox。在ListBox_prod我想要检索所有产品(来自PRODUCT表)和Listbox_item我希望在表单加载事件中检索与所选产品(来自PRODITEM表)相对应的所有项目。所有产品都有超过1项与之相关的产品。问题在于Listbox_item,因为它只显示了1个项目。但是我想要在选择特定产品时在Listbox_item中显示所有项目。类getData()中的DBCommands实际上导致了问题。这是我的代码:

public partial class form_prodItems : Form
{       
       private DBCommands dBCommand;

     public form_prodItems()
    {
        InitializeComponent();
        listBx_prod.SelectedIndexChanged += new EventHandler(listBx_prod_selValChange);
        listBx_item.SelectedIndexChanged += new EventHandler(listBx_item_selValChange);
    }
   private void form_prodItems_Load(object sender, EventArgs e)
     { 
        // ...
        refresh_listBx_prod("PRODUCT", this.listBx_prod, null, null);
        refresh_listBx_prod("PRODITEM", this.listBx_item, listBx_prod.ValueMember,   listBx_prod.SelectedValue.ToString());
    }

    private void listBx_item_selValChange(object sender, EventArgs e) // causing problem
    {
        if (listBx_item.SelectedValue != null)
            showPrice("PRODITEM", listBx_item.ValueMember, listBx_item.SelectedValue.ToString());
    }

    private void listBx_prod_selValChange(object sender, EventArgs e)
    {
        if(listBx_prod.SelectedValue != null)
           refresh_listBx_prod("PRODITEM", this.listBx_item, listBx_prod.ValueMember, listBx_prod.SelectedValue.ToString());
    }

    private void showPrice(string tblName,string where_column ,string where_val)
    {
        DataSet ds;
        ds = dBCommand.getData("select * from " + tblName + " WHERE " + where_column + " = '" + where_val + "'");
        DataRow col_val = ds.Tables[0].Rows[0];

        txtBox_12oz.Text = col_val.ItemArray[3].ToString();
        txtBox_16oz.Text = col_val.ItemArray[4].ToString();
        txtBox_20oz.Text = col_val.ItemArray[5].ToString();
        txtBox_1lbs.Text = col_val.ItemArray[6].ToString();
        txtBox_2lbs.Text = col_val.ItemArray[7].ToString();
        //ds.Clear();
    }

    private void refresh_listBx_prod(string tblName, ListBox listBox, string where_column, string where_val)
    {
        DataSet ds = new DataSet();
        dBCommand = new DBCommands();

        if (where_column == null)
        {
            ds = dBCommand.getData("SELECT * FROM " + tblName);
        }
        else
        {
            ds = dBCommand.getData("SELECT * FROM " + tblName + " WHERE " + where_column + " = " + where_val);
        }
        listBox.DataSource = ds.Tables[0];
     //   ds.Clear();
    }
}   


public class DBCommands
{
    private SqlConnection conn;
    private SqlDataAdapter dataAdapter;
    private DataSet container;

    public DataSet getData(string selectCmd)
    {
        container.Clear();    // I guess something needs to be fixed here some where..
        conn = getConnection();
        dataAdapter.SelectCommand = new SqlCommand(selectCmd, conn);
        dataAdapter.Fill(container);
        conn.Close();

       return container;
    }
    private SqlConnection getConnection()
    {
        SqlConnection retConn = new SqlConnection("Data Source=" + Environment.MachineName + "; Initial Catalog=RESTAURANT; Integrated Security = TRUE");
        retConn.Open();
        return retConn;
    }
}

实际上,数据集会刷新它所有的数据(SELECT * FROM PRODITEM,其中PRODUCT_id ='1')并显示上次执行的查询的数据i-e(select * from proditem where item_id = 1) 任何建议..

1 个答案:

答案 0 :(得分:0)

我的建议是尝试通过SqlCommand运行命令。 这样你就会对你得到的东西有更好的了解。 使用这个例子:

    SqlCommand command = new SqlCommand(selectCmd, conn);
    SqlDataReader reader = command.ExecuteReader();
    try
    {
        while (reader.Read())
        {
            Console.WriteLine(String.Format("{0}, {1}",
                reader[0], reader[1]));
        }
    }
    finally
    {
        // Always call Close when done reading.
        reader.Close();
    }

并修改它,以便您根据需要返回表格。 我给你的原因是它易于使用,你可以立即得到调试信息,帮助你理解sql错误