Кодило
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
1

Переполнение стека

27.04.2011, 01:30. Показов 1053. Ответов 0
Метки нет (Все метки)

Пишу класс для своего проекта для работы с базой, сохранения настроек и т.п., так вот при тестировании поймал непонятный для меня баг.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace MySQLLib
{
    public class DataBase
    {
        #region Variables
        /// <summary>
        /// Файл настроек
        /// </summary>
        private const string SettingsFile = @"settings.dbs";
 
        /// <summary>
        /// Строка для подключения к Базе
        /// </summary>
        public string ConnectionString { get; set; }
 
        /// <summary>
        /// Пользователь базы данных
        /// </summary>
        public string Db_User
        {
            get { return Db_User; }
            set
            {
                Db_User = value;
                SetConnectionString();
            }
        }
 
        /// <summary>
        /// Пароль пользователя
        /// </summary>
        public string Db_Password
        {
            get { return Db_Password; }
            set
            {
                Db_Password = value;
                SetConnectionString();
            }
        }
 
        /// <summary>
        /// Имя базы данных
        /// </summary>
        public string Db_Name
        {
            get { return Db_Name; }
            set
            {
                Db_Name = value;
                SetConnectionString();
            }
        }
 
        /// <summary>
        /// Адрес базы данных
        /// </summary>
        public string Db_Source
        {
            get { return Db_Source; }
            set
            {
                Db_Source = value;
                SetConnectionString();
            }
        }
        #endregion
 
        /// <summary>
        /// Генерация строки подключения
        /// </summary>
        /// <param name="user">Пользователь</param>
        /// <param name="password">Пароль</param>
        /// <param name="dbname">Имя базы</param>
        /// <param name="dbsource">Адрес базы</param>
        private void SetConnectionString(string user, string password, string dbname, string dbsource)
        {
            this.ConnectionString = String.Format("Database={0};Data Source={1};User Id={2};Password={3}", dbname, dbsource, user, password);
        }
 
        /// <summary>
        /// Перегрузка генерации строки подключения
        /// </summary>
        private void SetConnectionString()
        {
            this.ConnectionString = String.Format("Database={0};Data Source={1};User Id={2};Password={3}", this.Db_Name, this.Db_Source, this.Db_User, this.Db_Password);
        }
 
        /// <summary>
        /// Инициализация класса DataBase
        /// </summary>
        public DataBase()
        {
            this.Db_User = string.Empty;
            this.Db_Password = string.Empty;
            this.Db_Name = string.Empty;
            this.Db_Source = string.Empty;
            SetConnectionString();
        }
 
        /// <summary>
        /// Параметризированная инициализация класса DataBase
        /// </summary>
        /// <param name="Db_User">Пользователь базы данных</param>
        /// <param name="Db_Password">Пароль пользователя базы данных</param>
        /// <param name="Db_Name">Название базы данных</param>
        /// <param name="Db_Source">Адрес базы данных</param>
        public DataBase(string Db_User, string Db_Password, string Db_Name, string Db_Source)
        {
            this.Db_User = Db_User;
            this.Db_Password = Db_Password;
            this.Db_Name = Db_Name;
            this.Db_Source = Db_Source;
            SetConnectionString();
        }
 
        /// <summary>
        /// Загрузка настроек из файла
        /// </summary>
        public void LoadSettings()
        {
            DataBaseSettings dbs = new DataBaseSettings();
            dbs.Load(SettingsFile);
            this.Db_Name = dbs.Db_Name;
            this.Db_Password = dbs.Db_Password;
            this.Db_Source = dbs.Db_Source;
            this.Db_User = dbs.Db_User;
        }
 
        /// <summary>
        /// Сохранение настроек в файл
        /// </summary>
        public void SaveSettings()
        {
            DataBaseSettings dbs = new DataBaseSettings(this);
            dbs.Save(SettingsFile);
        }
    }
 
    [Serializable]
    public class DataBaseSettings
    {
 
        /// <summary>
        /// Пользователь базы данных
        /// </summary>
        public string Db_User
        {
            get;
            set;
        }
 
        /// <summary>
        /// Пароль пользователя
        /// </summary>
        public string Db_Password
        {
            get;
            set;
        }
 
        /// <summary>
        /// Имя базы данных
        /// </summary>
        public string Db_Name
        {
            get;
            set;
        }
 
        /// <summary>
        /// Адрес базы данных
        /// </summary>
        public string Db_Source
        {
            get;
            set;
        }
 
        /// <summary>
        /// Сохранение настроек базы данных в файл
        /// </summary>
        /// <param name="path">Путь к файлу</param>
        public void Save(string path)
        {
            using (StreamWriter sw = new StreamWriter(File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite)))
            {
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(sw.BaseStream, this);
            }
        }
 
        /// <summary>
        /// Загрузка настроек базы данных из файла
        /// </summary>
        /// <param name="path">Путь к файлу</param>
        public void Load(string path)
        {
            if (!File.Exists(path))
                return;
            using (StreamReader sr = new StreamReader(File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite)))
            {
                BinaryFormatter bf = new BinaryFormatter();
                object obj = bf.Deserialize(sr.BaseStream);
                if (obj is DataBaseSettings)
                {
                    DataBaseSettings dbs = obj as DataBaseSettings;
                    this.Db_Name = dbs.Db_Name;
                    this.Db_Password = dbs.Db_Password;
                    this.Db_Source = dbs.Db_Source;
                    this.Db_User = dbs.Db_User;
                }
                else
                    File.Delete(path);
            }
        }
 
        /// <summary>
        /// Конструктор класса
        /// </summary>
        /// <param name="db">Экземпляр класса DataBase</param>
        public DataBaseSettings(DataBase db)
        {
            this.Db_User = db.Db_User;
            this.Db_Source = db.Db_Source;
            this.Db_Password = db.Db_Password;
            this.Db_Name = db.Db_Name;
        }
 
        /// <summary>
        /// Конструктор класса
        /// </summary>
        public DataBaseSettings()
        {
            this.Db_Name = string.Empty;
            this.Db_Password = string.Empty;
            this.Db_Source = string.Empty;
            this.Db_User = string.Empty;
        }
    }
}
В поле Db_User класса DataBase на строке "{" вылезает исключение An unhandled exception of type 'System.StackOverflowException' occurred in MySQLLib.dll. Не пойму в чем может быть проблема. Тестирую следующим кодом:
C#
1
2
3
4
5
6
7
8
9
            try
            {
                MySQLLib.DataBase db = new MySQLLib.DataBase("123", "321", "asd", "dsa");
                db.SaveSettings();
                MySQLLib.DataBase bd = new MySQLLib.DataBase();
                bd.LoadSettings();
                MessageBox.Show(bd.ConnectionString);
            }
            catch (Exception z) { MessageBox.Show(z.ToString()); }
Исключение вылетает на первой же строке:
C#
1
MySQLLib.DataBase db = new MySQLLib.DataBase("123", "321", "asd", "dsa");
Неужели нельзя хранить переменные просто в виде полей, а надо создавать будет отдельные приватные переменные и привязывать поля к ним? Ибо проблема, как мне кажется, тут.

Добавлено через 12 минут
Да, когда вывел все поля в отдельные приватные переменные и привязал все к ним - сработало.

Добавлено через 1 час 26 минут
Понял в чем причина была, банальное зацикливание.
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.04.2011, 01:30
Ответы с готовыми решениями:

Переполнение стека при рекурсии
У меня есть рекурсионная функция. Заменить ее чем либо другим не получается. Но при выполнении ее...

Переполнение стека при рекурсии
Код: public void FindEvenlyShadedAreas(Bitmap b, Color Color_Arr1, Color Color_Arr2,...

Переполнение
Здравствуйте! Подскажите, как сделать поведение при переполнении типа таким, как в С? То есть,...

MemoryStream, переполнение памяти
Доброго времени суток, уважаемые! У меня возник вопрос следующего характера: Есть некоторый...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.04.2011, 01:30
Помогаю со студенческими работами здесь

Как можно вызвать переполнение буфера
Как можно вызвать переполнение буфера в C# 1.0 с использование .net 1.x ? Знаю, что можно, но...

Переполнение в результате выполнения арифметической операции
При использовании типа int - ошибки нет, но некоторым переменным необходимо присвоить значения...

Переполнение стека
public string XORLP4(string _lpart, string _newextentedbinarytempP4) { int...

Переполнение стека
Проблема в следующем, есть программа, которая должна многопоточно перебирать списки сайтов, запросы...

Переполнение стека
string syntax = { &quot;0&quot;, &quot;1&quot;, &quot;2&quot;, &quot;3&quot;, &quot;4&quot;, &quot;5&quot;, &quot;6&quot;, &quot;7&quot;, &quot;8&quot;, &quot;9&quot;, &quot;+&quot;, &quot;-&quot;, &quot;*&quot;, &quot;/&quot;,...

Переполнение стека
Привет записался на курсы по C#, там дали задание сделать консольный морской бой То, что смог...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru