Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
1 / 1 / 0
Регистрация: 02.02.2013
Сообщений: 168

Два события на одну кнопку - подключение и отключение БД

18.02.2015, 22:55. Показов 2520. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер. Разобрался с подключением, но вот не задача:

Есть кнопка.(КНОПКА ИСПОЛЬЗУЕТСЯ ОДНА, ЕЕ ТЕКСТОВОЕ ЗНАЧЕНИЕ МЕНЯЕТСЯ) Пока соединение не установлено, отображается надпись подключить "Подключить...". При нажатие на нее открывается соединение с базой данных, а ее свойство Text меняется на "Отключить...". Проблема в том что, когда я нажимаю на кнопку где уже написано "Отключить..." ничего не происходит.

Нужно чтобы когда текстовое значение "Подключить..." по нажатию подключались к базе, а когда на этой же кнопке написано "Отключить..." отключение от базы

Вообщем я сильно запутался, буду рад, если мне кто-нибудь подправит код, чтобы работал как нужно

Вот фрагмент кода

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
private void Connect_Click(object sender, EventArgs e)
        {
            string CONNECTION_STRING_ACCESS = @"Provider=Microsoft.Ace.OLEDB.12.0; Data Source=" + db_path;
            OleDbConnection conn = new OleDbConnection(CONNECTION_STRING_ACCESS);
            status_con = Convert.ToString(conn.State);
            if(status_con == "Closed")
            {
                try
                {
                conn.Open();
                MessageBox.Show("Установлено соединение с базой: " + textBox1.Text, "DataBase");
                label6.Text = "Установлено соединение с базой: " + textBox1.Text;
                label9.Text = "Полный путь к Базе: " + db_path;
                FileInfo file = new FileInfo(db_path);
                label4.Text = "Размер файла: " + file.Length / 1024 + " KB";
                label7.Text = "Дата создания: " + file.CreationTime;
                label8.Text = "Последний доступ: " + file.LastAccessTime;
                label10.Text = "Последнее изменение: " + file.LastWriteTime;
                Connect.Text = "Отключение...";
                status_con = Convert.ToString(conn.State);
                }
                catch (Exception ex)
                {
                MessageBox.Show("Ошибка подключения: " + ex.Message, "DataBase");
                textBox1.Text = "";
                }
            }
        }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.02.2015, 22:55
Ответы с готовыми решениями:

Два события на одну кнопку
Добрый день. Как можно повесить два события на одну кнопку? Допустим, есть кнопка, она на отвечает за старт / остановку сервера. От ...

Два события на одну кнопку
Приветствую уважаемые форумчане! Есть вопрос... Имеется следующий код: procedure TForm1.Button1Click(Sender: TObject); begin ...

Toggle. Два события на одну кнопку
Как сделать, чтобы при клике на кнопке, блок #cont исчез, а при повторном клике блок #cont появился? Вроде это уже устаревший способ и не...

7
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
18.02.2015, 23:31
Цитата Сообщение от whiteman95 Посмотреть сообщение
когда на этой же кнопке написано "Отключить..." отключение от базы
А зачем оно вам надо? Оберните создание подключения в using(), по выходу из него соединение само будет разорвано...
А постоянно открытое соединение не есть хорошо, мало ли что произойдет, как минимум везде вешать try{}finally{} для закрытия соединения, если что-то пойдет не так.
0
1 / 1 / 0
Регистрация: 02.02.2013
Сообщений: 168
18.02.2015, 23:36  [ТС]
insite2012, вы можете показать как подправить? Просто открытое соединение нужно чтобы работать с разными таблицами, редактировать, добавлять, удалять данные.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
18.02.2015, 23:40
Цитата Сообщение от whiteman95 Посмотреть сообщение
открытое соединение нужно чтобы работать с разными таблицами, редактировать, добавлять, удалять данные.
Ну вообще, по идее, делается отдельный метод на чтение, на вставку, на редактирование и так далее. И в каждом из них соединение открывается и закрывается.
Вот код рабочего класса для работы с БД типа Access, посмотрите, может что оттуда возьмете.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.IO;
using System.Data;
using System.Data.OleDb;
 
namespace Arcadia_Converter_v._2._0._0._1 {
    public class DBOperator {
        //Переменная класса проверки
        private GetInfo info;
        //Переменная строки соединения
        private string connectionString;
        //private static readonly поле
        private static readonly DBOperator Instance = new DBOperator();
 
        //public static свойство
        public static DBOperator CreateOperator {
            get { return Instance; }
        }
        //static конструктор
        static DBOperator() { }
 
        //private конструктор
        private DBOperator() {
            string dbPath = string.Format("{0}{1}", AppDomain.CurrentDomain.BaseDirectory, "Base.mdb");
            if (!File.Exists(dbPath)) {
                throw new FileNotFoundException("Файл базы отсутствует!");
            }
            info = new GetInfo();           
            connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + dbPath;
        }
        
        //Метод добавления данных конфигурации в базу
        public void AddData(byte[] data) {
            if (!info.ParseBuffer(data.ToList())) {
                throw new ArgumentException("Выбран некорректный файл!!");
            }
            string filterString=string.Format("[Модель]='{0}'AND [Продуктовый номер]='{1}'AND [Серийный номер]='{2}'",
                info.Model, info.ProductNumber, info.SerialNumber);
            DataRow[] rows = GetTable().Select(filterString);
            if (rows.Count() != 0) {
                throw new ArgumentException("Файл уже существует!");
            }
 
            string commandString =
                string.Format("INSERT INTO Table_1 VALUES ('{0}','{1}','{2}',@data)",
                info.Model, info.ProductNumber, info.SerialNumber);
            using (OleDbConnection connection = new OleDbConnection(connectionString)) {
                connection.Open();
                using (OleDbCommand cmd = new OleDbCommand()) {
                    cmd.CommandText = commandString;
                    cmd.Parameters.Add("@data", OleDbType.Binary);
                    cmd.Parameters["@data"].Value = data;
                    cmd.Connection = connection;
                    cmd.ExecuteNonQuery();
                }
            }
        }
        //Метод извлечения данных из базы (Конфигурация)
        public List<byte> GetConfigurationData(string model, string product, string serial) {
            List<byte> data = new List<byte>();
            string commandString =
                string.Format("SELECT data FROM Table_1 WHERE model='{0}'AND product='{1}'AND serial='{2}'",
                model, product, serial);
            using (OleDbConnection connection = new OleDbConnection(connectionString)) {
                connection.Open();
                using (OleDbCommand cmd = new OleDbCommand()) {
                    cmd.CommandText = commandString;
                    cmd.Connection = connection;
                    byte[] temp = (byte[])cmd.ExecuteScalar();
 
                    if (temp == null) {
                        throw new ArgumentException("Данные не найдены!");
                    }
                    data.AddRange(temp);
                    if (!info.ParseBuffer(data)) {
                        throw new ArgumentException("Данные повреждены!");
                    }
                }
            }
            return data;
        }
        //Метод извлечения данных из базы (SW)
        public List<byte> GetSwData(string swName) {
            List<byte> data = new List<byte>();
            string commandString =
                string.Format("SELECT data FROM Table_2 WHERE sw ='{0}'",
                swName);
            using (OleDbConnection connection = new OleDbConnection(connectionString)) {
                connection.Open();
                using (OleDbCommand cmd = new OleDbCommand()) {
                    cmd.CommandText = commandString;
                    cmd.Connection = connection;
                    byte[] temp = (byte[])cmd.ExecuteScalar();
 
                    if (temp == null) {
                        throw new ArgumentException("Данные не найдены!");
                    }
                    data.AddRange(temp);
                }
            }
            return data;
        }
        //Метод получения информационной таблицы для отображения
        public DataTable GetTable() {
            DataTable dt = new DataTable("Info");
            string selectCmd = "SELECT model,product, serial FROM Table_1";
            using (OleDbDataAdapter adapter = new OleDbDataAdapter(selectCmd,connectionString)) {
                adapter.Fill(dt);
            }
            dt.Columns[0].ColumnName = "Модель";
            dt.Columns[1].ColumnName = "Продуктовый номер";
            dt.Columns[2].ColumnName = "Серийный номер";
            return dt.AsEnumerable().OrderBy(r => r.Field<string>("Модель")).CopyToDataTable();
        }
        //Метод добавления данных SW в базу (служебный метод!)
        public void AddDataSW(byte[] data, string fileName) {
            string commandString =
                string.Format("INSERT INTO Table_2 VALUES ('{0}',@data)",
                fileName);
            using (OleDbConnection connection = new OleDbConnection(connectionString)) {
                connection.Open();
                using (OleDbCommand cmd = new OleDbCommand()) {
                    cmd.CommandText = commandString;
                    cmd.Parameters.Add("@data", OleDbType.Binary);
                    cmd.Parameters["@data"].Value = data;
                    cmd.Connection = connection;
                    cmd.ExecuteNonQuery();
                }
            }
        }
    }
}
0
1 / 1 / 0
Регистрация: 02.02.2013
Сообщений: 168
18.02.2015, 23:48  [ТС]
insite2012, вот так?

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
 private void Connect_Click(object sender, EventArgs e)
        {
            string CONNECTION_STRING_ACCESS = @"Provider=Microsoft.Ace.OLEDB.12.0; Data Source=" + db_path;
            using (OleDbConnection conn = new OleDbConnection(CONNECTION_STRING_ACCESS))
            {
                conn.Open();
                MessageBox.Show("Установлено соединение с базой: " + textBox1.Text, "DataBase");
                label6.Text = "Установлено соединение с базой: " + textBox1.Text;
                label9.Text = "Полный путь к Базе: " + db_path;
                FileInfo file = new FileInfo(db_path);
                label4.Text = "Размер файла: " + file.Length / 1024 + " KB";
                label7.Text = "Дата создания: " + file.CreationTime;
                label8.Text = "Последний доступ: " + file.LastAccessTime;
                label10.Text = "Последнее изменение: " + file.LastWriteTime;
                Connect.Text = "Отключение...";
                toolStripStatusLabel1.Text = "Сессия открыта | База данных: " + textBox1.Text;
                status_con = Convert.ToString(conn.State);
 
                DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                foreach (DataRow item in dt.Rows)
                {
                    comboBox1.Items.Add((string)item["TABLE_NAME"]);
                }
            }
        }
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
18.02.2015, 23:50
Цитата Сообщение от whiteman95 Посмотреть сообщение
вот так?
В общем да, но я предпочитаю всю работу с БД выносить в отдельный класс (и не только для работы с БД, в принципе). Так удобнее.
0
1 / 1 / 0
Регистрация: 02.02.2013
Сообщений: 168
19.02.2015, 00:05  [ТС]
insite2012, можете показать где происходит выход из подключения? я просто вот только только стал изучать работу с БД
вроде нет conn.Close()
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
19.02.2015, 09:47
Цитата Сообщение от whiteman95 Посмотреть сообщение
можете показать где происходит выход из подключения?
Строка 24 вашего кода, выход из блока using(). Этот блок на самом деле разворачивается в конструкцию try{} finally{}, в блоке finally{} как раз и происходит освобождение ресурса (в данном случае подключения к БД).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.02.2015, 09:47
Помогаю со студенческими работами здесь

2 события на одну кнопку
Привет, друзья! очень нужна Ваша помощь) в общем, есть форма подписки smartresponder-a, в ней 3 поля: имя, почта и скайп. при нажатии на...

Два события на кнопку
Отключать и включать таймер требуется одной кнопкой. Как оформить

На одну кнопку два макроса
Всем здравствуйте. Есть два макроса скрыть и показать строки и ячейки Каждый запускается по кнопке. В тоже время есть одна кнопка по...

Как при нажатии на кнопку создать еще одну кнопку?
Собственно во прос в выше, я нажимаю на кнопку, рядом должна появится еще одна, как такие вещи вообще реализуются?

Отключение события QueryClose и вообще событий
Нажатие крестика в правом верхнем углу формы генерирует событие QueryClose , при этом разрушается, а не гасится. Я хочу отключить это...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
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