Domanda

Il mio dilemma è che sto perdendo il mio ResultSet dalla tabella primaria quando si accede a una tabella chiave esterna. Ho bisogno di salvare i risultati dalla prima query tavolo mentre interrogo un altro tavolo.

Scenerio:
Io sono l'attuazione di un sistema di database ricetta. Ogni ricetta può avere da 1 a molti ingredienti. Per risolvere l'1 a molti, ho creato una tabella separata per gli ingredienti.

Ho una tabella di ricette:

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

E una tabella di ingredienti:

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

Nel mio programma, ho un oggetto ricetta che contiene un vettore di ingredienti:

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

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

Per eseguire un per ogni iterazione su una ricetta nella tabella, devo caricarlo dal database. Per completare la ricetta, devo caricare in tutti gli ingredienti associati con la ricetta.

Il problema è che quando carico negli ingredienti, perdo il set di risultati delle ricette. Il MySQL Connector C ++ in grado di gestire un solo set di risultati alla volta. Ho avuto fortuna a copiare i risultati o (quando le dimensioni della tabella cresce, non mi può essere utile per caricare in tutta risultati).

Quindi, come posso mantenere un cursore o puntatore alla tabella di ricetta mentre cerco e carico dal tavolo ingrediente?

Ecco cosa voglio fare:

  1. Per ogni ricetta nella tabella fare:
  2. Dati
  3. Leggi ricetta riga di risultati in Ricetta variabile.
  4. Usa ricetta ID per selezionare tutto ingredienti dove Recipe.ID_Recipe = Ingredient.ID_Recipe.
  5. Risultati di carico da tavolo ingrediente in vettore di variabili di ricetta.
  6. Passo oggetto ricetta per call-back la funzione.
  7. avanzare alla prossima ricetta nella tabella.
  8. Fine-per

Grazie in anticipo per eventuali suggerimenti.
(Sto usando MySQL, MySQL Connector C ++, Visual Studio 2008 - C ++)

È stato utile?

Soluzione

AFAICT, non c'è niente nel doc MySQL Connector / C ++ che indica che l'apertura di un secondo ResultSet invalida il primo. Si prega di inviare il codice da utilizzare per elaborare le righe. Si può fare qualcosa che si chiude il primo ResultSet prematuramente.

Altri suggerimenti

Basta tornare un set di risultati. Una colonna (o colonne) chiamato ricetta che rimane la stessa per ogni ingrediente. Da un join.

es

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

Questo vi darà una tabella si ciclo su ... quando il nome della ricetta modifiche allora sai che sono su per una nuova ricetta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top