Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
ImNIK
13 / 13 / 1
Регистрация: 21.05.2013
Сообщений: 61
1

Как правильно написать код в рамках ООП (C# + ADO.NET)

21.05.2013, 12:49. Просмотров 1462. Ответов 2
Метки нет (Все метки)

Добрый день.
Перешел в Delphi на C# стараюсь изменить свое мышление, что-бы писать в рамках ООП, но не всегда получается. Вот чувствую что у меня получился говнокод, а как сделать его правильным не могу понять.
Вот код:
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
   
public partial class Contact : Form
{     
        private void btnPhoneControl_Click(object sender, EventArgs e)
        {
            PhoneControl();
        }
 
        private void PhoneControl()
        {
            string newPhone = txtPhone.Text.Replace("(", "").Replace(")", "").Replace("-", "").Replace("_", "");
            if (oldPhone != newPhone)
            {
                string compId, compName, groupName;
                Boolean access = Sql.PhoneControl(newPhone, txtPhoneExt.Text, out compId, out compName, out groupName);
                if (access && compId == "") // Номер можно использовать, он ни кому не принадлежит
                {
                    MessageBox.Show("Номер телефона свободен");
                    Sql.PhoneEdit(phoneId, newPhone, txtPhoneExt.Text);
                }
                else if (access && compId != "") // Номер можно использовать, но прежде необходимо удалить у другой компании
                {
                    string msg = String.Format("Номер {0} принадлежит компании:\n№{1} {2}\nНаходящейся в группе: {3}.\nУдалить номер телефона у данной компании и присвоить текущей?", newPhone, compId, compName, groupName);
                    var result = MessageBox.Show(msg, "Номер телефона есть в базе данных!", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (result == DialogResult.No)
                    {
                        txtPhone.Text = oldPhone;
                    }
                    else // Удаление телефона у компании где он есть. И обновление телефона у текущей компании
                    {
                        Sql.PhoneDel(newPhone, txtPhoneExt.Text);
                        Sql.PhoneEdit(phoneId, newPhone, txtPhoneExt.Text);
                    }
                }
                else
                {
                    string msg = String.Format("Номер {0} принадлежит компании: \n№{1} {2}\nНаходящейся в группе: {3}\nИспользование данного телефона запрещено!", newPhone, compId, compName, groupName);
                    MessageBox.Show(msg, "Номер телефона есть в базе данных!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    txtPhone.Text = oldPhone;
                }
 
            }
        }
 
}
 
 
    class Sql
    {
        public static string ConnStr()
        {
            string returnValue = null;
            ConnectionStringSettings settings = ConfigurationManager.ConnectionStrings["BIGPhone.Properties.Settings.CRMConnectionString"];
            if (settings != null) returnValue = settings.ConnectionString;
            return returnValue;
        }
 
        public static Boolean PhoneControl(string phone, string addPhone, out string compId, out string compName, out string groupName)
        {
            Boolean access;
            compId = "";
            compName = "";
            groupName = "";
            using (SqlConnection conn = new SqlConnection(ConnStr()))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand("bigphone.PHONE_CONTROL", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@PHONE", SqlDbType.BigInt);
                cmd.Parameters["@PHONE"].Value = phone;
                cmd.Parameters.Add("@ADD_PHONE", SqlDbType.Int);
                cmd.Parameters["@ADD_PHONE"].Value = addPhone;
                SqlDataReader rdr;
                rdr = cmd.ExecuteReader();
                if (rdr.HasRows)
                {
                    rdr.Read();
                    compId = rdr["COMP_ID"].ToString();
                    compName = rdr["COMP_NAME"].ToString();
                    groupName = rdr["GROUP_NAME"].ToString();
                    access = Convert.ToBoolean(rdr["ACCESS"]);
                }
                else access = true; 
            }
            return access;
        }
 
        public static void PhoneDel(string phone, string addPhone)
        {
            using (SqlConnection conn = new SqlConnection(ConnStr()))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand("bigphone.PHONE_DEL", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@PHONE", SqlDbType.BigInt);
                cmd.Parameters["@PHONE"].Value = phone;
                cmd.Parameters.Add("@ADD_PHONE", SqlDbType.Int);
                cmd.Parameters["@ADD_PHONE"].Value = addPhone;
                cmd.ExecuteNonQuery();
            }
        }
 
        public static void PhoneEdit(int phoneId, string phone, string addPhone)
        {
            using (SqlConnection conn = new SqlConnection(ConnStr()))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand("EDIT_PHONE_CONT", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@ID", SqlDbType.Int);
                cmd.Parameters["@ID"].Value = phoneId;
                cmd.Parameters.Add("@PHONE", SqlDbType.BigInt);
                cmd.Parameters["@PHONE"].Value = phone;
                cmd.Parameters.Add("@ADD_PHONE", SqlDbType.Int);
                cmd.Parameters["@ADD_PHONE"].Value = addPhone;
                cmd.Parameters.Add("@USER_ACCESS", SqlDbType.Int);
                cmd.Parameters["@USER_ACCESS"].Value = User.id;
                cmd.ExecuteNonQuery();
            }
        }
    }
В форме редактируется телефон компании и на кнопку "Проверить" проверяется, нет ли такого телефона у других компаний. Если нет - то телефон апдейтим. Если есть - выводится сообщение с вопросом "удалить у другой компании и вставить в текущую?".
Все операции с базой вынес в класс Sql, что-бы основной код был более читаем. В классе Sql все методы делаю статическими, т.к. создавать объект не вижу смысла. Также Sql.PhoneControl возвращает несколько значений, поэтому сделал велосипед, с возвращаемыми параметрами. (были ли более хорошие варианты?)

На сколько данный код вообще имеет право на существование? И что требуется в нем изменить, что-то он не был говнокодом для программистов, которые будут сопровождать его в дальнейшем?
Заранее благодарен за любую помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2013, 12:49
Ответы с готовыми решениями:

Ado.net edm не генерирует код
// Создание кода по умолчанию отключено для модели...

Удаленный SQL-сервер Ado.Net + .Net remoting + Asp .Net
Всем привет! Нужно написать клиент-серверное приложение на основе Microsoft...

Как работать с ADO.NET?
Visual Studio 2013 Premium, в вкладке C# нет раздела Database / Data. Не могу...

ADO.NET, как делать хорошо?
Работаю с базами данных, но что-то мне подсказывает, что можно делать...

Как научиться работать с ADO.NET
Чувствую некоторую неловкость , когда задаю вопросы на форуме - возможно из-за...

2
Larsus
64 / 64 / 10
Регистрация: 19.10.2009
Сообщений: 234
21.05.2013, 14:27 2
Судить говно код это или нет я не буду, но простые замечание если допустим я буду использовать твой класс Sql, я могу не знать а может просто пропущу то что необходимо вызывать метод PhoneControl прежде чем проводить какие то манипуляции с телефоном в итоге я либо словлю эксепшен при редактировании номера если у тебя в базе это поле уникальное либо получиться что у двух организаций будут одинаковые номера. Правильнее на мой взгляд было бы выделение какой либо сущности, далее просто вариант а не правило, тем более представленное ниже далеко от идеала

например выделяем сущность организация
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
public class Organization
    {
        private string _phoneNumber;
        //остальные поля сущности ну там ид, наме и т.д
 
        public string PhoneNumber
        {
            get { return _phoneNumber; }
            set { _phoneNumber = value; }
        }
    }
 
//менеджер управления организацией, 
    public class OrganizationManager
    {
        public PhoneState UpdatePhone(Organization organization, bool ignoredublicate)
        {
            if (ignoredublicate  || ControlPhone(organization) ещё что там проверяешь)
            {
                в хранимке добавь чтоб вначале удалял записи о таком телефоне потом апдейтил
                return PhoneState.IsEdit;
            }
            else
             {
return PhoneState.IsErrorDublicate;
} 
            return PhoneState.IsError; ;
        }
 
        private bool ControlPhone(Organization organization)
        {
            //тут твоя проверка
            return true;
        }
    }
    public enum PhoneState
    {
        IsEdit,
        IsErrorDublicate,
        IsError
    }
 
ну и метод бы выглядел примерно так
        private void PhoneControl(bool ignoredublicate = false)
        {
            //organizationManager - можешь проинициализировать где тебе удобно, organization правильнее наверное при создании формы
            switch (organizationManager.UpdatePhone(organization, ignoredublicate))
            {
                    case PhoneState.IsError:
выводим об невозможности редактирования
                    break;
                    case PhoneState.IsEdit:
выводим об успешном изменени
                    break;
                    case PhoneState.IsErrorDublicate:
выводим запрос и если можно заменить вызываем PhoneControl(true);
                    break;
            }
        }

вообщем смотри сам как тебе удобнее, но лучше будет выделить базовый объект создать универсальный интерфейс менеджер или как хочешь его называй и уже от них наследоваться
1
ImNIK
13 / 13 / 1
Регистрация: 21.05.2013
Сообщений: 61
21.05.2013, 16:24  [ТС] 3
Larsus - спасибо. Только я одного не понял, по вашему от класса sql лучше вообще отказаться и весь код взаимодействия с БД писать в классе OrganizationManager?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2013, 16:24

Отличия ADO.NET'03 и ADO.NET'05
Друзья, есть ли отличия в технологии ADO.NET для 2003 и для 2005, и насколько...

Как добавить данные в связанные таблицы ADO.NET
Ни где не могу найти конкретную инфу как добавлять данные в связанные таблицы....

Как передать в процедуру Oracle параметр типа table%rowtype из ADO.NET?
Привет, что-то затруднился. Возможен ли вызов оракловой процедуры через...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru