c# - 如今“形状 - 追加”查询等效性

标签 c# sql asp.net sql-server vb.net

过去几周,我一直在将一个用 VB 编写的程序转换为 C#。 在某些地方,我注意到以一种奇怪的方式编写的查询,出现了“Shape”和“Append”这两个词。 例如:

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

我完全确定该查询的等效项是 INNER JOIN,类似于:

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 行只属于父记录集,但是 child 的记录集数是 6,但我不知道如何获取它们。

最佳答案

如果我没记错的话,SHAPE APPEND 关联父子数据,结果是您实际上为每个父行获得一个子记录集。使用结果时,您必须检查该记录集并适本地处理它(如果网格不支持它)。

当你说 60 行时,你是否可能只计算父记录集?

即使子记录集中没有行,它也会为您提供父记录集中的记录,因此它更像是 LEFT OUTER JOIN 但实际上并没有直接的 SQL 等价物这将为您提供 SHAPE APPEND 所做的分层结果。

如果您想继续使用 SHAPE APPEND,OleDbConnection 和 OleDbDataAdapter 仍然支持该语法,但您必须将 Provider=MSDataShape 添加到您的连接字符串。然后在获取行时,您将在父级 DataRow 上使用 GetChildRows() 来获取子行。

关于c# - 如今“形状 - 追加”查询等效性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25957377/

相关文章:

c# - 数据转换失败。 [ OLE DB 状态值(如果已知)= 2 ]

c# - 在 C# .NET 中使用 Lambda 进行模糊调用

mysql - 在 MySQL 的 JOIN 上设置 LIMIT

php - 我无法从我的代码中获得所需的结果

c# - 进入角色受限网页时,ASP.NET 默认页面重定向

c# - StringBuilder 是否在调用 ToString() 时缓存结果字符串?

c# - DateTime 时间戳有句点而不是冒号

javascript - 调用 window.open() 后 ListBox 被阻止

javascript - asp.net 控件位置不正确

c# - 操作失败 : The relationship could not be changed because one or more of the foreign-key properties is non-nullable