【问题标题】:Losing results when iterating over 1 to many table迭代 1 到多个表时丢失结果
【发布时间】:2010-01-04 18:08:50
【问题描述】:

我的困境是在访问外键表时我从主表中丢失了我的 ResultSet。我需要在查询另一个表时保存第一个表查询的结果。

场景:
我正在实施一个食谱数据库系统。每个食谱可以有 1 到多种成分。为了解决一对多的关系,我为成分创建了一个单独的表。

我有一张食谱表:

  ID_Recipe: primary key, integer;   
  Recipe_Title: CHAR(128);

还有一张配料表:

ID_Ingredient:  PRIMARY KEY, INTEGER;  
ID_Recipe:  INTEGER NOT NULL;  
Ingredient_Title: CHAR(64)  

在我的程序中,我有一个包含成分向量的食谱对象:

struct Ingredient
{
  int ID;
  int recipe_ID;
  std::string title;
};

struct Recipe
{
  int ID;
  std::string title;
  std::vector<Ingredient> recipe_ingredients;
};

为了对表中的配方执行 for each 迭代,我必须从数据库中加载它。为了完成食谱,我必须加载与食谱相关的所有成分。

问题是当我加载配料时,我丢失了食谱的结果集。 MySQL 连接器 C++ 一次只能处理一个结果集。我在复制结果时也没有运气(当表大小增加时,我可能不想加载整个结果)。

那么,当我从配料表中搜索和加载时,如何维护指向配方表的光标或指针?

这是我想做的:

  1. 对于表中的每个食谱,请执行以下操作:
  2. 将配方结果行数据读入 配方变量。
  3. 使用配方 ID 选择所有 Recipe.ID_Recipe = 的成分 成分.ID_Recipe。
  4. 从成分表加载结果 放入配方变量的向量中。
  5. 将配方对象传递给回调 功能。
  6. 前进到表中的下一个食谱。
  7. 结束

提前感谢您的任何建议。
(我正在使用 MySQL、MySQL 连接器 C++、Visual Studio 2008 - C++)

【问题讨论】:

  • 您实际上并不需要一个连接表来处理一对多关系。但在你的情况下,这是一个多对多的关系,因为一种成分可以在多个食谱中使用,不是吗?
  • 这是简化的演示文稿。我有一张所有成分的桌子。有一个表将配方 ID 映射到成分 ID,因此主键是复合,配方 ID + 成分 ID。这允许在不复制所有配方属性的情况下查找与配方相关的所有成分。

标签: mysql database mysql-connector


【解决方案1】:

AFAICT,MySQL 连接器/C++ 文档中没有任何内容表明打开第二个 ResultSet 会使第一个无效。请发布您用于处理行的代码。您可能正在做一些过早关闭第一个 ResultSet 的操作。

【讨论】:

  • 我编写了一些简单的测试代码,使用不同的 ResultSet 访问不同的表。这段代码没有问题。然后我修改了我的食谱程序,现在它可以工作了。
【解决方案2】:

只返回一个结果集。有一列(或多列)称为配方,每种成分保持相同。加入。

例如

select * from recipe left join ingr on recipe. ID_Recipe = ingr. ID_Recipe

这将为您提供一个循环遍历的表格...当食谱名称更改时,您就知道您正在使用新食谱。

【讨论】:

  • 虽然是一个很好的解决方案,但这可能会很慢,因为还必须检查每个配方名称字段。
  • 我认为这与执行多个服务器查询的开销相比并不慢(非常非常慢)。但我很高兴你发现了你的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
相关资源
最近更新 更多