2013-09-02 4 views
0

재귀에서 제품 코드를 만드는 데 문제가 있습니다. 는 내가하고 싶은 것입니다 :재귀를 사용하여 코드 생성

내가 코드 1000

-if 코드 데이터베이스 regenerateCode에 존재 (문자열 코드) 데이터베이스에

-else 인서트를 입력

코드 :

(...) if (codeExist) CodeTB.Text = regenerateCode (string toParse); // toParse = 실제로 예로 잘 작동

 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 1000 (존재) 1001 (존재) 1,002 (존재하지 인서트)이지만, 코드 = 1002, 그것과 일치 들어가는 else {return helper;} 그리고 왜 다시 regenerateCode() 메소드를 사용하는지 알 수 없습니다 ..

아이디어가 있으십니까?

+0

당신은 코드가 1002 일 때 else 절에 들어가야한다고 말했습니다 ... 당신은 또한 '1002 (존재하지 않음)'라고 했으므로 ... 'rdr.HasRows' = 그릇된. 당신의 문제는 정확히 무엇입니까? – Sheridan

+0

데이터베이스에 기존 코드 : 1001, 1002, 1003이 있습니다. 따라서 다음 코드는 1004가되어야합니다. 코드 텍스트 상자에 '1001'을 넣으면 정확히 거기에갑니다. regenerateCode (helper); // 1001, regenerateCode (helper); // 1002, regenerateCode (helper); // 1003, regenerateCode (helper); // 1004 -이 시점에서 문자열 코드는 정상이며 1004 코드를 반환해야하지만 그다지 중요하지 않습니다. return helper; // 마지막 줄에서 다시 regenerateCode (helper)로 이동합니다. // 1001 regenerateCode (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