在过去的几周里,我一直在用VB编写的程序转换为C#。 在某些地方,我注意到以奇怪的方式写的查询,单词'形状'和'追加'出现了。 例如:
SHAPE {SELECT Test, IdQuestion, QuestionName, QuestionTimeLimit, ImageLocation
FROM dbo.userViewConTestQues
WHERE (Test = 5) ORDER BY QuestionOrder} AS ParentCMD APPEND ({SELECT Answer,
IdAnswer, Question FROM dbo.userAnswers } AS ChildCMD RELATE IdQuestion TO Question) AS ChildCMD
我完全相信该查询的等价性将是一个内部联接,类似于:
SELECT A.Test, A.IdQuestion, A.QuestionName, A.QuestionTimeLimit, A.ImageLocation,
B.Answer, B.IdAnswer FROM dbo.userViewConTestQues A INNER JOIN
dbo.userAnswers B ON A.IdQuestion=B.Question WHERE A.Test=5 ORDER BY A.QuestionOrder
调试后我得到以下结果: 旧程序的记录数是60,这意味着60行,而运行我写的新查询得到了400多行,所以我想我错了。 什么是'形状 - 追加'现在是等价的?
编辑: 60行仅属于父记录集,但是孩子的记录集计数为6,但我不知道如何获取它们。
答案 0 :(得分:0)
如果我没记错,SHAPE APPEND会关联父子数据,结果就是你实际上得到了每个父行的子记录集。在使用结果时,您必须检查该记录集并适当地处理它(如果网格不支持它)。
当你说60行时,你是否可能只计算父记录集?
它也会从父记录集中给你一条记录,即使子记录集中没有行,所以它更像LEFT OUTER JOIN
但是没有真正的直接SQL等价物会给你SHAPE APPEND的分层结果。
如果要继续使用SHAPE APPEND,OleDbConnection和OleDbDataAdapter仍支持该语法,但您必须将Provider=MSDataShape
添加到连接字符串中。然后在获取行时,您将在父GetChildRows()
上使用DataRow
来获取子行。