从 C# 中的多个表的查询中检索数据

Retrieving Data from a query on multiple tables in C#

好吧,我有一个正在处理的 C# 程序,但我在尝试查询数据库时 运行 遇到了问题。

我有三个 table(不要考虑名字,它们是为了这个问题的目的而概括的)- CUSTOMER、CUSTORD 和 ORDERS

客户

订单

监护人

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

我试过的

我尝试使用数据集设计器中的查询配置向导向不同的 table 适配器添加查询。这样做的主要问题是,当我尝试使用 JOIN 时,它给我错误 "JOIN expression not supported." JOIN 是我知道如何使用 SQL 关联数据的唯一方法。

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

老实说,任何事情都有帮助,如果您需要更多信息,请告诉我。

规格

编辑

所以我采用了将所有内容都放入数组中以便稍后解析的方法。仍然出现一些错误,但也许它会更清楚地说明我正在尝试做的事情。我得到的错误是,"Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign key constraints." 我仔细检查过,没有任何内容为空,也没有重复任何内容。它可能是外键,但我该如何解决呢?这是代码...

  1. GetSelectedCustOrders 接受一个 custID 并查询 CUSTORD 以匹配 orderID
    • SELECT orderID FROM CUSTORD WHERE custID= selectedCust

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

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

SELECT * FROM CUSTORD WHERE custID= selectedCust

...然后它完美地工作了!我在我的 foreach 中实现了一个索引,所以我可以 select 只有 orderID 并将它们附加到 relationString 上。现在只是为了解析信息,将其转换为 int 和 运行 ORDERS 上的 orderID 查询。

所以我最终决定不 运行 第二次查询。首先,我只是用整个 ORDER table 填充了我的 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