Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 10.12.2011
Сообщений: 46

Выкладываю часть кода моей программы, хочу чтобы вы мне указали где что лучше здесь оптимизировать исправить

14.12.2011, 15:49. Показов 1706. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, я недавно в программировании на 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
/*
 * Created by SharpDevelop.
 * User: User
 * Date: 14.12.2011
 * Time: 13:15
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Data;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
 
namespace osaka24
{
    /// <summary>
    /// Description of Courier.
    /// </summary>
    public class Courier: DataTable
    {
        private MySqlDataAdapter myAdapter;
        private MySqlConnection myConnection;
        
        public Courier(Config _Config)
        {
            string Connect = string.Format("Database={0}; Data Source={1}; User Id={2}; Password={3}; character set=utf8", _Config.Database, _Config.DataSource, _Config.UserId, _Config.Password);
            myConnection = new MySqlConnection(Connect);
            this.Columns.Add("id", System.Type.GetType("System.String"));
            this.Columns.Add("name", System.Type.GetType("System.String"));
            string CommandText = "SELECT id, name FROM courier";
            myAdapter = new MySqlDataAdapter(CommandText, myConnection);
            FillData();
        }
        
        public void FillData()
        {
            try
            {
                myConnection.Open();
                myAdapter.Fill(this);
                myConnection.Close();
            }
            catch(Exception e)
            {
                MessageBox.Show(e.Message);
            }   
        }
        
        public void AddItem(string name)
        {
            MySqlCommand MyCommand = new MySqlCommand(string.Format("INSERT INTO courier (name) VALUES ('{0}')", name), myConnection);
            try
            {
                myConnection.Open();
                MyCommand.ExecuteNonQuery();
                myConnection.Close();
            }
            catch(Exception e)
            {
                MessageBox.Show(e.Message);
            }   
            this.Clear();
            FillData();
        }
        
        public void DeleteItem(string id)
        {
            
            MySqlCommand MyCommand = new MySqlCommand(string.Format("DELETE FROM courier WHERE id={0}", id), myConnection);
            try
            {
                myConnection.Open();
                MyCommand.ExecuteNonQuery();
                myConnection.Close();
            }
            catch(Exception e)
            {
                MessageBox.Show(e.Message);
            }   
            this.Clear();
            FillData();
        }
        
        public void DeleteAll()
        {
            MySqlCommand MyCommand = new MySqlCommand("TRUNCATE TABLE courier", myConnection);
            try
            {
                myConnection.Open();
                MyCommand.ExecuteNonQuery();
                myConnection.Close();
            }
            catch(Exception e)
            {
                MessageBox.Show(e.Message);
            }   
            this.Clear();
            FillData();
        }
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.12.2011, 15:49
Ответы с готовыми решениями:

Что здесь исправить,чтобы работало?
Что здесь исправить,чтобы работало? Код: //--------------------------------------------------------------------------- #include...

Мне нужны программы которые делает красивые кнопки что типо этой программы Button Shop 4 только лучше
Ищу программы которая делает красивые кнопки чтобы вставить в кнопку SpeedButton в делфи! помоги пожалуйста за ранее...

Cтруктура программы. Где пишем основную часть кода?
Добрый всем денек, есть ламерский вопрос, не пинайте ногами. Создаю проект C# в VS 2005, стандартный код, создаваемый по умолчанию вы...

18
185 / 185 / 53
Регистрация: 10.04.2009
Сообщений: 491
14.12.2011, 16:25
такой код угробит Вашу базу, параметры нужно передавать через параметры и это касается всех Ваших комманд
C#
1
2
var id = "5;DELETE FROM courier"
MySqlCommand MyCommand = new MySqlCommand(string.Format("DELETE FROM courier WHERE id={0}", id), myConnection);
0
 Аватар для chessman1
167 / 96 / 23
Регистрация: 13.03.2011
Сообщений: 402
14.12.2011, 16:49
Вы бы хоть две строки комментария написали. Я не понял о чем код.
0
0 / 0 / 0
Регистрация: 10.12.2011
Сообщений: 46
15.12.2011, 01:55  [ТС]
Это DataTable для DataGridView в котором я планирую держать список курьеров, далее у меня будет форма для чтого чтобы добавлять курьера в список, и кнопка удалить для того чтобы удалить всех курьеров, или отдельного выбранного.

Пожалуйста с примерами ваших поправок а то по ссылкам я туго соображаю. Заранее спасибо

Добавлено через 8 часов 13 минут
Как грамотнее и короче записать следующий код
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
        public void AddItem(int id, string discount)
        {
            string CommandText = "SELECT category.name AS category_name, product.id AS product_id, product.name AS product_name, product.price AS product_price FROM product INNER JOIN category ON category.id = product.pid WHERE product.id = @id";
            MySqlCommand myCommand = new MySqlCommand(CommandText, myConnection);
            myCommand.Parameters.AddWithValue("@id", id);
            MySqlDataReader MyDataReader;
            try
            {
                DataRow[] FoundRows = Select(string.Format("product_id = '{0}' AND discount = '{1}'", id, discount));
                if (FoundRows.Length > 0)
                {
                    FoundRows[0]["count"] = Convert.ToInt32(FoundRows[0]["count"]) + 1;
                }
                else
                {
                    myConnection.Open();
                    MyDataReader = myCommand.ExecuteReader();
                    MyDataReader.Read();
                    double discount_price = CalcDiscountPrice(discount, MyDataReader["product_price"].ToString());
                    this.Rows.Add(MyDataReader["category_name"], MyDataReader["product_id"], MyDataReader["product_name"], MyDataReader["product_price"], discount, 1, discount_price);
                    MyDataReader.Close();
                    myConnection.Close();
                }
            }
            catch(Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }
0
 Аватар для Celly
158 / 148 / 25
Регистрация: 23.01.2011
Сообщений: 319
15.12.2011, 02:02
Времени нету вчитыватся, но первое что бросается в глаза, это отсутствие
C#
1
myConnection.Close();
в блоке finally...
И необходимо удалить закрытие подключения из else...
1
0 / 0 / 0
Регистрация: 10.12.2011
Сообщений: 46
15.12.2011, 16:41  [ТС]
Учел, вот исправленный вариант
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
    public class BuyList: DataTable
    {
        private MySqlConnection myConnection;
        
        public BuyList(MySqlConnection _myConnection)
        {
            myConnection = _myConnection;
            this.Columns.Add("category_name", System.Type.GetType("System.String"));
            this.Columns.Add("product_id", System.Type.GetType("System.String"));
            this.Columns.Add("product_name", System.Type.GetType("System.String"));
            this.Columns.Add("product_price", System.Type.GetType("System.String"));
            this.Columns.Add("discount", System.Type.GetType("System.String"));
            this.Columns.Add("count", System.Type.GetType("System.String"));
            this.Columns.Add("discount_price", System.Type.GetType("System.String"));
        }
        
        public void AddItem(int id, string discount)
        {
            DataRow[] FoundRows = Select(string.Format("product_id = '{0}' AND discount = '{1}'", id, discount));
            if (FoundRows.Length > 0)
            {
                FoundRows[0]["count"] = Convert.ToInt32(FoundRows[0]["count"]) + 1;
            }
            else
            {
                try
                {   
                    myConnection.Open();
                    string CommandText = "SELECT category.name AS category_name, product.id AS product_id, product.name AS product_name, product.price AS product_price FROM product INNER JOIN category ON category.id = product.pid WHERE product.id = @id";
                    MySqlCommand myCommand = new MySqlCommand(CommandText, myConnection);
                    myCommand.Parameters.AddWithValue("@id", id);
                    MySqlDataReader MyDataReader;   
                    MyDataReader = myCommand.ExecuteReader();
                    try
                    {
                        MyDataReader.Read();
                        decimal discount_price = CalcDiscountPrice(discount, MyDataReader["product_price"]);
                        this.Rows.Add(MyDataReader["category_name"], MyDataReader["product_id"], MyDataReader["product_name"], MyDataReader["product_price"], discount, 1, discount_price);
                    }
                    catch(Exception e)
                    {
                        MessageBox.Show(e.Message);
                    }
                    finally
                    {
                        MyDataReader.Close();
                    }
                }
                catch(Exception e)
                {
                    MessageBox.Show(e.Message);
                }                   
                finally
                {
                    myConnection.Close();
                }                   
            }
        }
        
        public decimal CalcSum()
        {
            decimal sum = 0;
            foreach(DataRow Row in this.Rows)
            {
                sum += Convert.ToDecimal(Row["discount_price"]) * Convert.ToDecimal(Row["count"]);
            }
            return sum;
        }
        
        private decimal CalcDiscountPrice(string _discount, object _price)
        {
            int discount = Convert.ToInt32(_discount);      
            decimal price = Convert.ToDecimal(_price);
            decimal discount_price = price*(1 - discount * 0.01m);
            return discount_price;
        }
}
0
CEO
Эксперт С++
 Аватар для Alligieri
2258 / 1248 / 57
Регистрация: 16.03.2009
Сообщений: 3,588
16.12.2011, 02:10
Цитата Сообщение от -=Tiger=- Посмотреть сообщение
_myConnection
Цитата Сообщение от -=Tiger=- Посмотреть сообщение
discount_price
Нарушение соглашений по коду, лучше сделать myConnection и discountPrice

Добавлено через 1 минуту
хотя многие места в коде - тихий ужас например
Цитата Сообщение от -=Tiger=- Посмотреть сообщение
System.Type.GetType("System.String")
1
 Аватар для Celly
158 / 148 / 25
Регистрация: 23.01.2011
Сообщений: 319
16.12.2011, 09:13
Сообщение от -=Tiger=-
System.Type.GetType("System.String")
Ну да... ведь можно написать
C#
1
typeof(string);
1
0 / 0 / 0
Регистрация: 10.12.2011
Сообщений: 46
16.12.2011, 09:39  [ТС]
Сделал, продолжаем конструктивную критику
0
Мохаммед Али
 Аватар для asd321
131 / 70 / 5
Регистрация: 14.08.2009
Сообщений: 916
16.12.2011, 09:40
Цитата Сообщение от -=Tiger=- Посмотреть сообщение
Сделал, продолжаем конструктивную критику
закомментируйте сами методы и парочку строк внутри них
C#
1
sum += Convert.ToDecimal(Row["discount_price"]) * Convert.ToDecimal(Row["count"]);
тута можно условие поставить -вдруг конвертер не сработает -самое простое
C#
1
2
3
4
5
6
7
try{
sum += Convert.ToDecimal(Row["discount_price"]) * Convert.ToDecimal(Row["count"]);
}
catch
{
sum+=0;
}
0
0 / 0 / 0
Регистрация: 10.12.2011
Сообщений: 46
16.12.2011, 09:47  [ТС]
Цитата Сообщение от Alligieri Посмотреть сообщение
Нарушение соглашений по коду, лучше сделать myConnection и discountPrice

Добавлено через 1 минуту
хотя многие места в коде - тихий ужас например
а имена полей тоже так писать без "_", по поводу _myConnection, я его передаю в конструктор, а в конструкторе присваиваю другой переменной "myConnection" чтобы использовать их всех функций и процедур, поэтому имя такое глупое задал, а вообще как это верно решить? продолжаем критику советы

Для asd321 выкладываю с комментариями и объяснением.
Короче это DataTable который будет отображать список покупок на данный момент, при нажатии кнопки сделать заказ, сработает функция Buy().
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
namespace osaka24
{
    /// <summary>
    /// Description of buylist.
    /// </summary>
    public class BuyList: DataTable
    {
        private MySqlConnection myConnection;
        
        public BuyList(MySqlConnection _myConnection)
        {
            myConnection = _myConnection;
            this.Columns.Add("category_name", typeof(string));
            this.Columns.Add("product_id", typeof(string));
            this.Columns.Add("product_name", typeof(string));
            this.Columns.Add("product_price", typeof(string));
            this.Columns.Add("discount", typeof(string));
            this.Columns.Add("count", typeof(string));
            this.Columns.Add("discount_price", typeof(string));
        }
        
        //добавление товара в список покупок. Если товар присутствует в списке и скидка имеет ту же величину, то увеличивается количество
        public void AddItem(int id, string discount)
        {
            DataRow[] FoundRows = Select(string.Format("product_id = '{0}' AND discount = '{1}'", id, discount));
            if (FoundRows.Length > 0)
            {
                FoundRows[0]["count"] = Convert.ToInt32(FoundRows[0]["count"]) + 1;
            }
            else
            {
                try
                {   
                    myConnection.Open();
                    string CommandText = "SELECT category.name AS category_name, product.id AS product_id, product.name AS product_name, product.price AS product_price FROM product INNER JOIN category ON category.id = product.pid WHERE product.id = @id";
                    MySqlCommand myCommand = new MySqlCommand(CommandText, myConnection);
                    myCommand.Parameters.AddWithValue("@id", id);
                    MySqlDataReader MyDataReader;   
                    MyDataReader = myCommand.ExecuteReader();
                    try
                    {
                        MyDataReader.Read();
                        decimal discountPrice = CalcDiscountPrice(discount, MyDataReader["product_price"]);
                        this.Rows.Add(MyDataReader["category_name"], MyDataReader["product_id"], MyDataReader["product_name"], MyDataReader["product_price"], discount, 1, discountPrice);
                    }
                    catch(Exception e)
                    {
                        MessageBox.Show(e.Message);
                    }
                    finally
                    {
                        MyDataReader.Close();
                    }
                }
                catch(Exception e)
                {
                    MessageBox.Show(e.Message);
                }                   
                finally
                {
                    myConnection.Close();
                }                   
            }
        }
        
        //подсчет суммы
        public decimal CalcSum()
        {
            decimal sum = 0;
            foreach(DataRow Row in this.Rows)
            {
                sum += Convert.ToDecimal(Row["discount_price"]) * Convert.ToDecimal(Row["count"]);
            }
            return Math.Round(sum, 2);
        }
        
        //подсчет цены со скидкой
        private decimal CalcDiscountPrice(string _discount, object _price)
        {
            int discount = Convert.ToInt32(_discount);      
            decimal price = Convert.ToDecimal(_price);
            decimal discount_price = price*(1 - discount * 0.01m);
            return Math.Round(discount_price, 2);
        }
        
        public void Buy()
        {
            //тут будет запрос на добавление в бд с датой и списком товаров.
        }
    }
}
0
Мохаммед Али
 Аватар для asd321
131 / 70 / 5
Регистрация: 14.08.2009
Сообщений: 916
16.12.2011, 10:04
мне вот интересно почему вы Linq не юзаете?
0
0 / 0 / 0
Регистрация: 10.12.2011
Сообщений: 46
16.12.2011, 10:15  [ТС]
Я на C# относительно недавно поэтому всего не знаю и даже не знаю как юзать Linq и чем он лучше того что я делаю.
0
Мохаммед Али
 Аватар для asd321
131 / 70 / 5
Регистрация: 14.08.2009
Сообщений: 916
16.12.2011, 10:37
прост с ним код сократиться раза в два вот ссылка http://msdn.microsoft.com/ru-r... s.90).aspx
1
0 / 0 / 0
Регистрация: 10.12.2011
Сообщений: 46
16.12.2011, 10:39  [ТС]
Хоршоо - это я прочту а насчет остального был бы рад выслушать советы критику.
0
Мохаммед Али
 Аватар для asd321
131 / 70 / 5
Регистрация: 14.08.2009
Сообщений: 916
16.12.2011, 10:55
да тут так то кода нету особо.
0
0 / 0 / 0
Регистрация: 10.12.2011
Сообщений: 46
16.12.2011, 12:38  [ТС]
допустим вот этот кусок, в котором я ищу если ли уже такой товар в списке если есть то просто увеличить количество, мне думается есть способ более правильный для решения этой задачи.
C#
1
2
3
4
5
                        DataRow[] FoundRows = Select(string.Format("product_id = '{0}' AND discount = '{1}'", id, discount));
                        if (FoundRows.Length > 0)
                        {
                                FoundRows[0]["count"] = Convert.ToInt32(FoundRows[0]["count"]) + 1;
                        }
Добавлено через 1 час 15 минут
У меня так же проблема заключается в том что при первом запуске и подключении к бд, не установлены нужные следующие таблицы которые юзает программа, можно ли их через bat файл всех установить и как, заранее спасибо
0
Мохаммед Али
 Аватар для asd321
131 / 70 / 5
Регистрация: 14.08.2009
Сообщений: 916
16.12.2011, 13:22
зачем бат файл программно проще будет
SQL
1
SHOW TABLES FROM BASE
показывает все таблицы если таблиц нет то делаем CREATE
0
0 / 0 / 0
Регистрация: 10.12.2011
Сообщений: 46
16.12.2011, 21:04  [ТС]
а вот лучше следующее, у меня есть сходный дамп базы для работы программы, и надо чтобы при первом запуске он загрузил дамп на сервр, как это сделать? дамп в формате .sql, я сначало думал через реестр узнать путь к консоли mysql и загрузить дамп, а есть наверное лучше способ, вот хочу выслушать вашу версию
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.12.2011, 21:04
Помогаю со студенческими работами здесь

Можно ли как нибудь явно указать тип переменной, чтобы ИДЕ рассказала мне все что я хочу знать об объекте?
Можно как нибудь указать тип, но не через оператор new...

Что мне нужно для того чтобы программы компилировались?
Скачал и установил jdk-6u21-windows-i586, Скачал и установил TextPad. Что мне нужно для того чтобы программы компилировались? У меня...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru