从C#

时间:2015-06-17 00:56:24

标签: c# database winforms datagridview tableadapter

好的,所以我有一个我正在研究的C#程序,在尝试查询我的数据库时遇到了问题。

我有三张桌子(不考虑名字,这是为了这个问题的目的而推广) - CUSTOMER,CUSTORD,&订单

客户

  • 有一个名为custID的字段

订单

  • 有一个名为orderID的字段

的CustOrd

  • 多对多关系 - 一个客户可以拥有多个订单,一个订单可以拥有多个客户
  • 包含...
    • custID(链接到CUSTOMER.custID)
    • orderID(链接到ORDERS.orderID)

基本上我需要一种方法来放入custID并获取客户拥有的所有订单的列表并在dataGridView中显示该订单。

我尝试过什么

我尝试使用DataSet Designer中的查询配置向导向不同的tableAdapter添加查询。这个问题的主要问题是,当我尝试使用JOIN时,它会给出错误“不支持JOIN表达式”。 JOIN是我知道如何使用SQL关联数据的唯一方法。

我也尝试手动添加代码,但我永远无法以正确的格式获取信息以便在dataGridView中显示。如果我可以将与custID相关的所有orderID安排到一个数组中,那么我可以找到解决方案。我可以弄清楚如何遍历该信息,根据每个sibID进行查询,但是如何将所有信息编译成一个tableAdapter以显示在dataGridView中?

老实说,一切都有帮助,如果您需要更多信息,请告诉我。

规格

  • IDE:Visual Studio Ultimate 2012
  • 使用以下方法创建的数据库:Microsoft Access 2010
  • 语言:C#

修改

所以我开始将所有内容放入一个我可以稍后解析的数组中。仍然会遇到一些错误,但也许它会对我正在尝试做的事情有所了解。我得到的错误是“无法启用约束。一行或多行包含违反非空,唯一或外键约束的值。”我仔细检查,没有任何东西是空的,没有重复。它可能是外键,但我该如何解决呢?这是代码......

  1. GetSelectedCustOrders接受custID并查询CUSTORD以匹配orderID
    • SELECT orderID FROM CUSTORD WHERE custID = selectedCust
  2. DBDataSetTableAdapters.CUSTORDTableAdapter CUSTORDTableAdapter = new DBDataSetTableAdapters.CUSTORDTableAdapter();

        string relationString = "-1";
        DataTable relationResult = new DataTable();
    
        relationResult = CUSTORDTableAdapter.GetSelectedCustOrders(Convert.ToInt16(custID));
    
        foreach (DataRow row in relationResult.Rows)
        {
            foreach (DataColumn column in relationResult.Columns)
            {
                relationString += Convert.ToString(row[column]);
                testLabel.Text = relationString;
            }
        }
    

    编辑2

    所以我之所以得到上述错误的原因是因为我试图更改表的架构。如果我将SQL查询语句更改为...

    SELECT * FROM CUSTORD WHERE custID= selectedCust

    ......然后它完美无缺!我在foreach中实现了一个索引,所以我只能选择orderID并将它们附加到relationString上。现在只需解析信息,将其转换为int并在ORDERS上运行查询以获取orderID。

1 个答案:

答案 0 :(得分:1)

所以我最终决定不再运行第二个查询。首先,我只使用整个ORDER表填充了DataGridView。将我的orderID放入逗号分隔的字符串后,我将它们分成一个数组。我关闭了DataGridView中的所有行,并根据sRelationArray中的所有orderID检查了行的orderID。如果它匹配,我重新打开行。代码如下:

private void setOrderTable()
    {
        string relationString = getRelatedOrders(); //gives the comma delimited string
        string[] sRelationArray = relationString.Split(new[] {','}, System.StringSplitOptions.RemoveEmptyEntries);
        CurrencyManager currencyManager1 = (CurrencyManager)BindingContext[dataGridView1.DataSource];

        try
        {
            this.oRDERSTableAdapter.Fill(this.DBDataSet.ORDERS);
        }
        catch (System.Exception ex)
        {
            System.Windows.Forms.MessageBox.Show("Error finding orders. \n" + ex.Message);
        }

        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            currencyManager1.SuspendBinding();
            row.Visible = false;

            for (int i = 0; i < sRelationArray.Length; i++)
            {
                if (sRelationArray[i] == row.Cells[0].Value.ToString())
                {
                    row.Visible = true;
                }
            }
        }
        currencyManager1.ResumeBinding();
    }//end set orders table