好的,所以我有一个我正在研究的C#程序,在尝试查询我的数据库时遇到了问题。
我有三张桌子(不考虑名字,这是为了这个问题的目的而推广) - CUSTOMER,CUSTORD,&订单
基本上我需要一种方法来放入custID并获取客户拥有的所有订单的列表并在dataGridView中显示该订单。
我尝试使用DataSet Designer中的查询配置向导向不同的tableAdapter添加查询。这个问题的主要问题是,当我尝试使用JOIN时,它会给出错误“不支持JOIN表达式”。 JOIN是我知道如何使用SQL关联数据的唯一方法。
我也尝试手动添加代码,但我永远无法以正确的格式获取信息以便在dataGridView中显示。如果我可以将与custID相关的所有orderID安排到一个数组中,那么我可以找到解决方案。我可以弄清楚如何遍历该信息,根据每个sibID进行查询,但是如何将所有信息编译成一个tableAdapter以显示在dataGridView中?
老实说,一切都有帮助,如果您需要更多信息,请告诉我。
所以我开始将所有内容放入一个我可以稍后解析的数组中。仍然会遇到一些错误,但也许它会对我正在尝试做的事情有所了解。我得到的错误是“无法启用约束。一行或多行包含违反非空,唯一或外键约束的值。”我仔细检查,没有任何东西是空的,没有重复。它可能是外键,但我该如何解决呢?这是代码......
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;
}
}
所以我之所以得到上述错误的原因是因为我试图更改表的架构。如果我将SQL查询语句更改为...
SELECT * FROM CUSTORD WHERE custID= selectedCust
......然后它完美无缺!我在foreach中实现了一个索引,所以我只能选择orderID并将它们附加到relationString上。现在只需解析信息,将其转换为int并在ORDERS上运行查询以获取orderID。
答案 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