2015-09-21 113 views
0

我有一个具有某些属性(名称,经度,纬度等)的对象位置,并且其中一个属性是对象“水平线”。选择加入对象的属性

地平线有Dictionary <float,float>(组AZIMUT高的地方的地平线点)

我想建立一个表来存储对象“地方”,我也有物体“地平线”的烦恼

由于我不知道字典中有多少点,我不能只为每个点建立一个列。

所以我觉得我必须创建另一个表 “dbo.horizo​​ns” 与列

  • 地名-varChar
  • AZIMUT - 真正
  • 高度 - 真正

,然后使用JOIN来选择所有点

但我不明白如何构建命令

如果我参加一个这样的命令:

SELECT places.name, places.longitude, places.latitude...,     
horizon.azimut, horizon.height   
FROM places LEFT JOIN dbo.horizons   
ON places.name = dbo.horizons.namePlace 

我怎么看它?

我用dataRedaer.Read()来读取数据库中的一行。

我如何获得所有积分并只建立一个地方?

的并且在插入了同样的问题,我如何建立一个INSERT命令插入一个地方与地平线

感谢

回答

1

有很多方法,但让我们与您正在做的事情的方式。

随着您在问题中的查询,您将获得每个地点的多行,因为您的datareader将为与地点相关联的每个地平线都有一行。因此,您需要将位置保存在变量中,并在每次数据读取器循环到新行时查看它是否是相同的Place。如果是,则只需将Horizo​​n添加到当前位置。如果它发生了变化,那么你知道开始一个新的地方。

至于INSERT,你将不得不做一个多步骤操作。您无法使用单个命令插入两个表格。因此,您将Place放置到Place表格中,然后将每个Horizo​​ns插入到Horizo​​n表格中。

+0

我不能同时拥有一行所有的点? –

+1

为了防止将来出现问题,您还应该在查询中添加一个ORDER BY,以保证地名是一起排列的。否则,如果有人对您的SQL表进行了更改,查询优化器可能会决定以不同的顺序将您的结果发送回去。 – DeadZone

+0

你可以,但这是一个不同的(也是更复杂的)SQL语句。这个SO问题显示它是如何完成的:http://stackoverflow.com/questions/194852/concatenate-many-rows-into-a-single-text-string –