2013-09-02 2 views
0

У меня возникла проблема с созданием кода продукта в рекурсии. То, что я хочу сделать, это:Сгенерировать код с рекурсией

вхожу код 1000

-Если код существует в regenerateCode базы данных (строка кода)

-else вставки в базу данных

Код:

(...) if (codeExist) CodeTB.Text = регенерировать код (строка toParse); // 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; 
       } 

На самом деле это отлично работает, например: 1000 (существуют) 1001 (существуют) 1002 (не существует, вставка), но когда код = 1002, он переходит в соответствие с else {return helper;} и не знаю, зачем снова переходить на метод recateCode().

Любые идеи?

+0

Вы сказали, что когда код = 1002, он переходит в предложение else ... он * должен * делать ... вы также сказали «1002 (не существует)» ... поэтому 'rdr.HasRows' = ложный. Что именно * * ваша проблема? – Sheridan

+0

У меня в базе данных существующие коды: 1001, 1002, 1003. Итак, следующий должен быть 1004. Когда я ставил «1001» в текстовое поле кода, он идет именно там: restoreateCode (helper); // 1001, restoreateCode (helper); // 1002, restoreateCode (хелпер); // 1003, restoreateCode (helper); // 1004 - в этот момент строковый код в порядке, и он должен возвращать код 1004, но он этого не делает, просто соединяется с: return helper; // последняя строка и снова переходит в recateCode (helper); // 1001 restoreateCode (helper); // 1002 – user13657

+0

Вы просто пытаетесь найти самый высокий номер «кода» в базе данных или есть «пробелы» в последовательности номеров кода, которые вы пытаетесь найти? – Sheridan

ответ

1

Это происходит потому, что вы ничего не делаете с возвращаемым значением. Вы передаете помощник рекурсии, но не добавляете возвращаемое значение в любом месте. ваш метод должен выглядеть так:

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; 
     } 
    } 
    } 
} 

Кроме того, помните, что в то время как строка является ссылочными типами, они неизменяемы. это означает, что строка, которая передается как аргумент, не изменится, как обычный массив. см.: How are strings passed in .NET?

+0

Это именно то, что мне нужно. Большое спасибо! – user13657

Смежные вопросы