迭代1到多个表时丢失结果

时间:2010-01-04 18:08:50

标签: mysql database mysql-connector

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

之情况:
我正在实施配方数据库系统。每个食谱可以有1到多种成分。为了解决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;
};

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

问题是,当我装入配料时,我会丢失配方的结果集。 MySQL Connector C ++ 一次只能处理一个结果集。我没有运气复制结果(当表格大小增加时,我可能不想加载整个结果)。

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

这是我想要做的:

  1. 对于表格中的每个食谱,请执行以下操作:
  2. 将配方结果行数据读入 食谱变量。
  3. 使用食谱ID选择全部 其中Recipe.ID_Recipe =的成分 Ingredient.ID_Recipe。
  4. 从成分表中加载结果 到食谱变量的矢量。
  5. 将食谱对象传递给回叫 功能
  6. 进入下表中的下一个食谱。
  7. 最终用于
  8. 提前感谢您的任何建议 (我正在使用MySQL,MySQL Connector C ++,Visual Studio 2008 - C ++)

2 个答案:

答案 0 :(得分:1)

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

例如

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

这将为您提供一个循环的表...当食谱名称发生变化时,您就知道自己正在使用新食谱。

答案 1 :(得分:1)

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