2013-09-02 4 views
0

Je rencontre un problème avec la création de code de produit en récursivité. Ce que je veux faire est:Générer du code avec récursion

J'entre le code 1000

-Si le code existe dans la base de données regenerateCode (code de chaîne)

d'insertion -else dans la base de données

code:

(...) if (codeExist) CodeTB.Text = regénèreCode (chaîne àParse); // toParse = 1000

 string regenerateCode(string toParse) 
       { 
        string helper = ""; 

        int parseCode = int.Parse(toParse); 
        helper = new string('0', 4 - parseCode.ToString().Length); 
        helper += parseCode + 1; 


        using (SqlConnection conn = new SqlConnection(cString.c_String)) 
        { 
         conn.Open(); 
         using (SqlCommand cmd = new SqlCommand("SELECT Product.productID FROM Product " + 
          "WHERE Product.PLU = '" + helper + "' ", conn)) 
         { 
          using (SqlDataReader rdr = cmd.ExecuteReader()) 
          { 
           if (rdr.HasRows) 
           { 
    // if code still exist in database, regenerate it 
            regenerateCode(helper); 
           } 
           else 
           { 
//else return code 
            return helper; 
           } 
          } 
         } 
        } 
        return helper; 
       } 

En fait, il fonctionne très bien avec l'exemple: 1000 (existe) 1001 (existe) 1002 (existe pas, insert), mais lorsque le code = 1002, il passe en ligne avec else {return helper;} et je ne sais pas pourquoi retourner à la méthode regenerateCode().

Des idées?

+0

Vous avez dit que lorsque le code = 1002, il va dans else clause ... il * should * do ... vous avez également dit '1002 (n'existe pas)' ... donc 'rdr.HasRows' = faux. Quel est exactement votre problème? – Sheridan

+0

J'ai dans la base de données des codes existants: 1001, 1002, 1003. Donc, le prochain devrait être 1004. Quand je mets '1001' dans la zone de texte de code il va exactement là: regenerateCode (helper); // 1001, regenerateCode (helper); // 1002, regenerateCode (helper); // 1003, regenerateCode (helper); // 1004 - à ce moment, le code de chaîne est correct et il devrait renvoyer le code 1004, mais il ne le fait pas, il suffit de: retourner l'aide; // dernière ligne, et à nouveau dans regenerateCode (helper); // 1001 regenerateCode (helper); // 1002 – user13657

+0

Essayez-vous simplement de trouver le numéro de «code» le plus élevé dans la base de données, ou y a-t-il des «trous» dans la séquence de numéros de code que vous essayez de trouver? – Sheridan

Répondre

1

Cela arrive parce que vous ne faites rien avec la valeur de retour. Vous passez l'assistant à la récursivité, mais ne placez pas la valeur de retour nulle part. votre méthode devrait ressembler à ceci:

string regenerateCode(string toParse) 
{ 
    string helper = ""; 

    int parseCode = int.Parse(toParse); 
    helper = new string('0', 4 - parseCode.ToString().Length); 
    helper += parseCode + 1; 

    using (SqlConnection conn = new SqlConnection(cString.c_String)) 
    { 
    conn.Open(); 
    using (SqlCommand cmd = new SqlCommand("SELECT Product.productID FROM Product " + 
     "WHERE Product.PLU = '" + helper + "' ", conn)) 
    { 
     using (SqlDataReader rdr = cmd.ExecuteReader()) 
     { 
     // Return the next code that doesn't exist 
     return rdr.HasRows ? regenerateCode(helper) : helper; 
     } 
    } 
    } 
} 

Aussi, rappelez-vous que si la chaîne sont des types de référence, ils sont immuables. ce qui signifie qu'une chaîne passée en argument ne changera pas comme un tableau normal. voir: How are strings passed in .NET?

+0

C'est exactement ce dont j'ai besoin. Merci beaucoup! – user13657