0

私のジレンマは、外部キーテーブルにアクセスするときにプライマリテーブルからResultSetを失うことです。別のテーブルをクエリするときに、最初のテーブルクエリの結果を保存する必要があります。

Scenerio:
レシピデータベースシステムを実装しています。各レシピには、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コネクタC++は、一度に1つの結果セットのみを処理できます。結果をコピーすることもできませんでした(テーブルのサイズが大きくなると、結果全体をロードしたくない場合があります)。

では、材料テーブルから検索してロードするときに、レシピテーブルへのカーソルまたはポインタを維持するにはどうすればよいですか?

これが私がやりたいことです:

  1. 表のレシピごとに、次のことを行います。
  2. レシピ結果の行データをレシピ変数に読み込みます。
  3. レシピIDを使用して、Recipe.ID_Recipe=Ingredient.ID_Recipeであるすべての材料を選択します。
  4. 材料テーブルからレシピ変数のベクトルに結果をロードします。
  5. レシピオブジェクトをコールバック関数に渡します。
  6. 表の次のレシピに進みます。
  7. End-for

提案を事前に感謝します。
(MySQL、MySQL Connector C ++、Visual Studio 2008-C ++を使用しています)

4

2 に答える 2

1

1つの結果セットを返すだけです。各材料で同じままであるレシピと呼ばれる1つまたは複数の列を用意します。参加してください。

例えば

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

これにより、ループするテーブルが表示されます...レシピ名が変更されると、新しいレシピを使用していることがわかります。

于 2010-01-04T18:13:51.640 に答える
1

AFAICT、MySQL Connector/C++ doc には、2 番目の ResultSet を開くと最初の ResultSet が無効になることを示すものは何もありません。行の処理に使用するコードを投稿してください。最初の ResultSet を途中で閉じるようなことをしている可能性があります。

于 2010-01-04T20:10:28.473 に答える