0

Productというテーブルがあります(ProductCodeフィールドのデータ型はvarcharです):

ID     ProductName    ProductCode
1       aaa              0001
2       bbb              0002
3       ccc              0004
4       ddd              0006
5       eee              0007
6       fff              0008

私の問題は次のとおりです。現在の場合、ProductCodeフィールドの値は「0006」です。「0009」の値を生成したいと思います。

public string GenerateNumber(string codeNumber)
{

    StringBuilder strSql = new StringBuilder();
    strSql.Append("select count(1) from Product");
    strSql.Append(" where ProductCode=@codeNumber");
    SqlParameter[] parameters = {
        new SqlParameter("@codeNumber", SqlDbType.NChar,8)
    };
    parameters[0].Value = codeNumber;
    bool existInDatabase = SQLHelper.Exists(strSql.ToString(), parameters);
    if (existInDatabase)
    {
        this.GenerateNumber((Convert.ToInt32(codeNumber) + 1).ToString().PadLeft(4, '0'));
    }
    return (Convert.ToInt32(codeNumber) + 1).ToString().PadLeft(4, '0');
}

この関数を:GenerateNumber( "0006")のようなものと呼びます

結果は0009を返しますが、そうではありません!

誰かが私を助けることができますか?ありがとう、私は初心者です!

4

1 に答える 1

0

これにasp.netで再帰を使用することは、オーバーヘッドが大きすぎるように思われます。

これを行うには、共通テーブル式を使用してこの値を 生成するストアドプロシージャをGenerateNextProductCodeに記述します。

このコードが失敗する理由は、再帰の結果を返さないためです。

次のように修正します。

public string GenerateNumber(string codeNumber)
{

        StringBuilder strSql = new StringBuilder();
        strSql.Append("select count(1) from Product");
        strSql.Append(" where ProductCode=@codeNumber");
        SqlParameter[] parameters = {
                new SqlParameter("@codeNumber", SqlDbType.NChar,8)
        };
        parameters[0].Value = codeNumber;
        bool existInDatabase = SQLHelper.Exists(strSql.ToString(), parameters);
        if (existInDatabase)
        {
           return this.GenerateNumber((Convert.ToInt32(codeNumber) + 1).ToString().PadLeft(4, '0'));
        }
        return (Convert.ToInt32(codeNumber) + 1).ToString().PadLeft(4, '0');
}
于 2012-09-11T05:16:16.823 に答える