2016-10-30 37 views
0

我正在加载父记录的子集和子记录到数据集,然后设置datarelations和foreignkeyconstraints,所以当我构建dataadapter select stmt for孩子记录,我必须确保只加载父母在场的孩子记录,以避免参考完整性错误。由于ParentTable的子集已加载到数据集中,所以我试过:加载数据集其中dataadapter select命令使用IN子句与子查询

daChild = new OleDBDataAdapter(CreateOledbCommand(“select * from Childtable where ChildKey in(ds.tables(”“ParentTable”“))”,dconn) )

但是得到了一个“未定义的函数'ds.tables'表达式”运行时错误。

所以,我试图创建一个列表传递给IN子句,像这样:

昏暗名为myDataView作为数据视图=新数据视图(ds.tables( “ParentTable”))

昏暗MyTempParentTable如数据表= MyDataView.ToTable(假, “ParentKey”)

daChild =新OleDbDataAdapter的(CreateOledbCommand( “SELECT * FROM ChildTable其中ChildKey在(MyTempParentTable)”,dconn))

我在调试器中检查和MyTempParentT实际上,它是一个包含ParentTable关键字的列表。我认为IN子句可以将一列数据作为有效输入。显然不是,因为我在运行时出现“没有给出一个或多个必需参数的值”错误。

我只是出于想法。我所有的谷歌搜索的IN子句都是IN(value1,value2,value3 ...),并且没有给出包含更复杂表达式的IN子句的任何示例。 任何人都可以告诉我我错过了什么,或者可能有不同的方式来实现这一目标?我试图让IN子句工作,因为我认为这是最有效的方法来做到这一点...也许它不是......感谢您的任何帮助。

回答

0

我还没有找到关于为什么IN子句不起作用的问题的答案,但为防万一别人有这个问题我会发布我的解决方法。

我像往常一样加载父记录,但我的dataadapter选择stmt为子记录有一个“WHERE 1 = 0”,以便零记录最初加载。当显示一个新的父记录时,我会确定是否该父记录的子记录已经加载到数据集中,如果没有,我加载它们。底线是,我不预先加载子记录,而是I根据需求加载它们。这个解决方案对我来说很好。