none
Ошибка переполения стека. RRS feed

  • Вопрос

  • Вобщем столкнулся с такой странной проблемой:

    есть бизнес класс Persons в котором есть метод, получения сущности Person, выглядит он так:
    public Person GetPerson(Guid userId)
    {
    SqlConnection connection = new SqlConnection(mConnectionString);
    SqlCommand command = new SqlCommand("dbo.GetPerson", connection);

    command.CommandType = CommandType.StoredProcedure;

    command.Parameters.Add(new SqlParameter("@userId", SqlDbType.UniqueIdentifier));

    command.Parameters["@userId"].Value = userId;

    connection.Open();

    SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);

    reader.Read();

    Person person = new Person(reader);

    reader.Close();

    return person;
    }

    Проблема начинается вот с этого места Person person = new Person(reader), сразу привожу код конструктора класса Person:

     

    public Person(IDataReader record)
    {
    mId = (record["Id"] != DBNull.Value) ? Convert.ToUInt64(record["Id"]) : ulong.MinValue;
    mUserId = (Guid)record["UserId"];
    mFirstName = (record["FisrtName"] != DBNull.Value) ? Convert.ToString(record["FisrtName"]) : string.Empty;
    mMiddleName = (record["MiddleName"] != DBNull.Value) ? Convert.ToString(record["MiddleName"]) : string.Empty;
    mSacondName = (record["SacondName"] != DBNull.Value) ? Convert.ToString(record["SacondName"]) : string.Empty;
    mNickName = (record["NickName"] != DBNull.Value) ? Convert.ToString(record["NickName"]) : string.Empty;
    mEmail = (record["Email"] != DBNull.Value) ? Convert.ToString(record["Email"]) : string.Empty;
    mMobilePhone = (record["MobilePhone"] != DBNull.Value) ? Convert.ToString(record["MobilePhone"]) : string.Empty;
    mWorkPhone = (record["WorkPhone"] != DBNull.Value) ? Convert.ToString(record["WorkPhone"]) : string.Empty;
    mHomePhone = (record["HomePhone"] != DBNull.Value) ? Convert.ToString(record["HomePhone"]) : string.Empty;
    mBirthDate = (record["BirthDate"] != DBNull.Value) ? Convert.ToDateTime(record["BirthDate"]) : DateTime.MinValue;
    mCountry = (record["Country"] != DBNull.Value) ? Convert.ToString(record["Country"]) : string.Empty;
    mCity = (record["City"] != DBNull.Value) ? Convert.ToString(record["City"]) : string.Empty;
    mAddress = (record["Address"] != DBNull.Value) ? Convert.ToString(record["Address"]) : string.Empty;
    mWhenAdd = (record["WhenAdd"] != DBNull.Value) ? Convert.ToDateTime(record["WhenAdd"]) : DateTime.MinValue;
    mWhenEdit = (record["WhenEdit"] != DBNull.Value) ? Convert.ToDateTime(record["WhenEdit"]) : DateTime.MinValue;
    }



    Если в отладке зайти в конструктор Person, то в нем все прекрасно выполняется, во все поля заносятся корректные значения, но после того как объект person создан половина полей
    его имеют не вычисленное значение, т.е. как тока вышли из конструктора так половина полей теряется.... 
    Попытка обратится к ним в отладчике приводит к тому, что отладка завершается сама собой... 

    А если позволить выполняться программе без остановок в отладке,  то попытка обращения к полям объекта Person приводит к исключению StackoverflowException.

    Никаких циклов и рекурсий у меня нет вообще... и метод GetPerson вызывается всего один раз за все время работы приложения....

    не могу понять почему так происходит....
    • Перемещено Tagore Bandlamudi 1 октября 2010 г. 22:35 MSDN Forums consolidation (От:Visual C#)
    21 марта 2010 г. 21:02

Ответы

  • Всем спасибо, ошибку я нашел и исправил :)

     

    Сам не знаю как-так вчера ошибку не мог увидеть... - седне глянул на свежую голову и все стало ясно...  - косяк был в нескольких свойствах, сам в торопях его сделал... например вместо mId писал Id и получалось:

    public ulong Id { get { return Id; } } // и вот она бесконечная рекурсия....

    Вообщем, извиняюсь за ложную тревогу :)

    • Помечено в качестве ответа I.Vorontsov 22 марта 2010 г. 8:38
    22 марта 2010 г. 8:36

Все ответы

    1. Как Вы определили, что половина полей теряется?
    2. Других свойств, кроме основаных на этих значениях нет?
    3. Если я правильно понял, то File.WriteAllText(@"C:\1.tmp", GetPerson(...).Id.ToString()); приводит к StackoverflowException? Проверьте пожалуйста, создается ли такой файл.
    BTW, Sacond -> Second.
    http://www.alexatnet.com/ - consulting, my blog, articles and discussions
    21 марта 2010 г. 23:54
  • Всем спасибо, ошибку я нашел и исправил :)

     

    Сам не знаю как-так вчера ошибку не мог увидеть... - седне глянул на свежую голову и все стало ясно...  - косяк был в нескольких свойствах, сам в торопях его сделал... например вместо mId писал Id и получалось:

    public ulong Id { get { return Id; } } // и вот она бесконечная рекурсия....

    Вообщем, извиняюсь за ложную тревогу :)

    • Помечено в качестве ответа I.Vorontsov 22 марта 2010 г. 8:38
    22 марта 2010 г. 8:36