Создать код с рекурсией

У меня возникла проблема с созданием кода продукта в рекурсии. Я хочу сделать следующее:

Я ввожу код 1000

-If код существует в базе данных restoreateCode (строковый код)

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

Код:

(...) if (codeExist) CodeTB.Text = restoreateCode (строка 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;} и не имеет понятия, зачем снова перегенерировать код (например, ) метод..

Есть идеи?

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

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

licensed under cc by-sa 3.0 with attribution.