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

Обработать исключение при добавлении данных в таблицу Access

16.12.2013, 22:02. Показов 1884. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста как обработать исключение? Событие на кнопке, происходит добавление данных в таблицу в аксесе


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void btnInsM_Click(object sender, EventArgs e)
        {
 
        
                OleDbCommand cmd = new OleDbCommand();
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = "Insert into materials(idmater,nazvaniemater,cenazagramm) Values ('" +
                    idmater.Text + "','" + nazvaniemater.Text + "','" + cenazagramm.Text + "')";
                cmd.Connection = MyCon;
                    MyCon.Open();
                    cmd.ExecuteNonQuery();
                    MyCon.Close();
        
 
        }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.12.2013, 22:02
Ответы с готовыми решениями:

Как обработать исключение при добавлении в массив?
Что необходимо записать в исключении? Если в строке не цифра или строка пустая - никакое значение в массив не включается. private...

Исключение при добавлении записей в MS Access
Пишу простую программу на добавление записей в БД Acces. Все делаю исходя из этого видео oFgl71x1PX4 Запускаю программу, заполняю...

При добавлении записи в таблицу (Access) дублирует результат. Кидаю пример кода...
Помогите плз. При добавлении записи в таблицу (Access) дублирует результат. Кидаю пример кода.. Добавление происходит но дважды... Почему...

20
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
16.12.2013, 22:12
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void btnInsM_Click(object sender, EventArgs e)
        {
 try
     {   
                OleDbCommand cmd = new OleDbCommand();
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = "Insert into materials(idmater,nazvaniemater,cenazagramm) Values ('" +
                    idmater.Text + "','" + nazvaniemater.Text + "','" + cenazagramm.Text + "')";
                cmd.Connection = MyCon;
                    MyCon.Open();
                    cmd.ExecuteNonQuery();
                    MyCon.Close();
       }
catch(Exception e)
{
MessageBox.Show(e.Message);
} 
 
        }
0
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 101
16.12.2013, 22:17  [ТС]
Пробовал так. Он тогда мне выдает при правильном вводе, что Подключение не было закрыто. Подключение открыто.
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
16.12.2013, 22:19
Цитата Сообщение от TobyShow Посмотреть сообщение
Подключение не было закрыто. Подключение открыто.
Ну так у вас подключение подставляется из вне, проверяйте его статус и открывайте по необходимости

C#
1
2
3
4
if (MyCon.State != ConnectionState.Open)
            {
 MyCon.Open();
            }
0
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 101
16.12.2013, 22:24  [ТС]
А куда этот код запихать?
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
16.12.2013, 22:24
C#
1
2
3
4
5
6
7
8
9
10
11
OleDbCommand cmd = new OleDbCommand();
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = "Insert into materials(idmater,nazvaniemater,cenazagramm) Values ('" +
                    idmater.Text + "','" + nazvaniemater.Text + "','" + cenazagramm.Text + "')";
                cmd.Connection = MyCon;
                    if (MyCon.State != ConnectionState.Open)
            {
 MyCon.Open();
            }
                    cmd.ExecuteNonQuery();
                    MyCon.Close();
1
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 101
16.12.2013, 22:26  [ТС]
Большое спасибо!!
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
17.12.2013, 12:13
Не хорошо закрывать подключение, которое не было открыто:
C#
1
2
3
4
5
6
bool IsOpened = MyCon.State == ConnectionState.Open;
if(!IsOpened)
    MyCon.Open();
cmd.ExecuteNonQuery();
if(!IsOpened)
    MyCon.Close()
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
17.12.2013, 12:16
Цитата Сообщение от kodv Посмотреть сообщение
Не хорошо закрывать подключение, которое не было открыто:
Т.е. код

C#
1
2
3
4
if (MyCon.State != ConnectionState.Open)
{
 MyCon.Open();
}
Не откроет подключение?
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
17.12.2013, 12:21
Grishaco, Код, приведенный мной, открывает подключение, если оно закрыто, и закрывает, если оно было закрыто изначально. Если же поключение было открыто до выполения кода, то не выполнится ни Open, ни Close, и это подключение останется открытым. Под такому принципу, допустим, работает DataAdapter.

Добавлено через 1 минуту
Цитата Сообщение от Grishaco Посмотреть сообщение
Не откроет подключение?
Он подключение откроет, если оно было закрыто. Но в вашем коде покдлючение закроется в любом случае. А если оно используется в другой части приложение, и там не предполагается, что оно может внезапно закрыться?
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
17.12.2013, 12:48
Цитата Сообщение от kodv Посмотреть сообщение
Он подключение откроет, если оно было закрыто. Но в вашем коде покдлючение закроется в любом случае. А если оно используется в другой части приложение, и там не предполагается, что оно может внезапно закрыться?
Вообще это ТС его закрывает. Я не вижу его кода и не могу догадываться что он там делает, может у него дальше опять открывается соединение, а ваш код его не закроет.
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
17.12.2013, 12:58
Grishaco, Да топикстартер вообще только открывает подключение но не закрывает. Поэтому и исключения ловит. Я говорю про то, как должно быть. По хорошему, если метод, который выполняет какие то запросы к базе данных, открывает подключение под свои нужды, то он его должен закрывать. Если не открывает, то и закрывать его тоже не должен.
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
17.12.2013, 13:01
Цитата Сообщение от kodv Посмотреть сообщение
Да топикстартер вообще только открывает подключение но не закрывает
Вот это я написал?

C#
1
MyCon.Close();
Цитата Сообщение от kodv Посмотреть сообщение
По хорошему, если метод, который выполняет какие то запросы к базе данных, открывает подключение под свои нужды, то он его должен закрывать.
Ну в принципе так, но вообще соединение нужно открывать оборачивая в using, а не держать его.
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
17.12.2013, 14:17
Цитата Сообщение от Grishaco Посмотреть сообщение
вообще соединение нужно открывать оборачивая в using, а не держать его.
Если ипользуется новое соединение, то да. Если же используется уже созданное соидинение, то using не подходит, и нужно использовать ту конструкцию, про которую я говорю. Допустим, мы создали соединение через using, внутри using мы его передали в метод, который с использованием этого соединение выполняет запрос к БД.
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
17.12.2013, 14:24
Цитата Сообщение от kodv Посмотреть сообщение
Если же используется уже созданное соидинение
При вашем подходе, если где то посередине возникнет исключение, возможно некорректное поведение программы и никто не даст вам гарантии, что подключение валидно. В противном случае, вы должны ставить проверки на соединение повсюду в коде.

using гарантирует уничтожение подключения как объекта, в любом случае.
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
17.12.2013, 18:39
Цитата Сообщение от Grishaco Посмотреть сообщение
В противном случае, вы должны ставить проверки на соединение повсюду в коде.
DataAdapter работает с подключением по тому же принципу, как я описал. Никто не ставит под сомнение такой подход, ну, наверное, кроме вас.
Цитата Сообщение от Grishaco Посмотреть сообщение
using гарантирует уничтожение подключения как объекта, в любом случае.
Разве кто то это оспаривал? Только, во-первых, не всегда объект подключения требует уничтожения, зачастую его достаточно просто закрыть до следующего использования. Во-вторых, не всегда возможно использовать using в отношении подключения. Если у нас метод получает подключение входным параметром, то using уже не подходит, так как в using'е нужно создавать новый объект, а входной параметр, по идее, уже создан.
PS: Спор ни о чем. Если вы считаете, что можно спокойно закрывать заранее созданное подключение в независимости от того, было ли оно открыто до используещего его куска кода - дело ваше. Я этот бессмысленный спор продолжать не собираюсь.
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
17.12.2013, 18:53
Цитата Сообщение от kodv Посмотреть сообщение
DataAdapter работает с подключением по тому же принципу, как я описал.
Я с вами не спорю, но покажите в коде ТС DataAdapter.

Если уж ТС захотел работать напрямую, то пусть учится подключение использовать атомарно. Открыл, получил данные, закрыл. Во всяком случае проблем у него будет меньше.

Добавлено через 11 минут
Да и последнее загляните в код DataAdapter и вы увидите, что он работает по принципу, на который указывал я.
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
19.12.2013, 19:41
Цитата Сообщение от Grishaco Посмотреть сообщение
Да и последнее загляните в код DataAdapter и вы увидите, что он работает по принципу, на который указывал я.
Не охота искать этот код самостоятельно. Не лень было только на MSDN зайти:
Метод Fill получает строки из источника данных с помощью оператора SELECT, указанного в связанном свойстве SelectCommand. Объект подключения, связанный с оператором SELECT, должен быть допустимым, но открывать его не требуется. Если подключение было закрыто до вызова метода Fill, оно открывается для извлечения данных, а затем закрывается. Если подключение было открыто до вызова метода Fill, оно остается открытым.
Поэтому покажите код, с любопытством посмотрю, как оборачивается в using объект, которые передается в метод уже созданным. В описании оператора using написано следующее:
Можно создать объект ресурсов, а затем передать переменную в оператор using, однако этот способ не является рекомендованным. В этом случае после того, как элемент управления выводится из блока using, объект остается в области действия, даже если он больше не сможет обращаться к неуправляемым ресурсам. Другими словами, он больше не будет полностью инициализирован. При попытке использовать объект вне блока using возникает риск вызова исключения. По этой причине предпочтительно создать объект в операторе using и ограничить область его действия блоком using.
Сомнваюсь, что Microsoft при реализации классов .NET противоречило своим же рекомендациям. И не могло это быть, потому что при использование using внутри метода Fill, соединение бы уничтожалось после выполнения команды.
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
19.12.2013, 21:47
Вы цепляетесь к словам, вот это утверждение
Цитата Сообщение от kodv Посмотреть сообщение
Если подключение было закрыто до вызова метода Fill, оно открывается для извлечения данных, а затем закрывается.
Противоречит вашему же изречению

Цитата Сообщение от kodv Посмотреть сообщение
Код, приведенный мной, открывает подключение, если оно закрыто, и закрывает, если оно было закрыто изначально. Если же поключение было открыто до выполения кода, то не выполнится ни Open, ни Close, и это подключение останется открытым. Под такому принципу, допустим, работает DataAdapter.
DataAdapter закрывает подключение по любому.

Вот код из кишочков

Кликните здесь для просмотра всего текста
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
private int FillInternal(DataSet dataset, DataTable[] datatables, int startRecord, int maxRecords, string srcTable, IDbCommand command, CommandBehavior behavior)
    {
      int num = 0;
      bool flag = null == command.Connection;
      try
      {
        IDbConnection connection3 = DbDataAdapter.GetConnection3(this, command, "Fill");
        ConnectionState originalState = ConnectionState.Open;
        if (MissingSchemaAction.AddWithKey == this.MissingSchemaAction)
          behavior |= CommandBehavior.KeyInfo;
        try
        {
          DbDataAdapter.QuietOpen(connection3, out originalState);
          behavior |= CommandBehavior.SequentialAccess;
          IDataReader dataReader = (IDataReader) null;
          try
          {
            dataReader = command.ExecuteReader(behavior);
            num = datatables == null ? base.Fill(dataset, srcTable, dataReader, startRecord, maxRecords) : base.Fill(datatables, dataReader, startRecord, maxRecords);
          }
          finally
          {
            if (dataReader != null)
              dataReader.Dispose();
          }
        }
        finally
        {
          DbDataAdapter.QuietClose(connection3, originalState);
        }
      }
      finally
      {
        if (flag)
        {
          command.Transaction = (IDbTransaction) null;
          command.Connection = (IDbConnection) null;
        }
      }
      return num;
    }
 
private static void QuietClose(IDbConnection connection, ConnectionState originalState)
    {
      if (connection == null || originalState != ConnectionState.Closed)
        return;
      connection.Close();
    }


Но не в этом суть, не важно как и кто работает, вы привыкли по своему, я по своему. Это дело каждого. Важно что и ваш вариант будет работать и мой.

З.Ы. На счет using погорячился.
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
20.12.2013, 06:56
Цитата Сообщение от Grishaco Посмотреть сообщение
Противоречит вашему же изречению
Не исключаю, что вы поняли меня не правильно. Перечитайте еще раз.
Цитата Сообщение от kodv Посмотреть сообщение
Если подключение было закрыто до вызова метода Fill, оно открывается для извлечения данных, а затем закрывается.
Цитата Сообщение от kodv Посмотреть сообщение
Код, приведенный мной, открывает подключение, если оно закрыто, и закрывает, если оно было закрыто изначально.
На мой взгляд написано одно и то же.
Цитата Сообщение от Grishaco Посмотреть сообщение
DataAdapter закрывает подключение по любому.
Повторю цитату из MSDN. Ссылка на статью выше.
Цитата Сообщение от kodv Посмотреть сообщение
Если подключение было открыто до вызова метода Fill, оно остается открытым.
А таже хочу обратить внимание на кусок вами же приведенного кода:
C#
1
2
3
4
5
6
private static void QuietClose(IDbConnection connection, ConnectionState originalState)
    {
      if (connection == null || originalState != ConnectionState.Closed) // Если изначально подключение было не закрыто, то есть, открыто
        return; // то ни хрена не делаем и выходим из метода
      connection.Close(); // иначе закрываем имеющееся подключение
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.12.2013, 06:56
Помогаю со студенческими работами здесь

Ошибка при добавлении данных в таблицу
При выполнении запроса на добавление в таблицу выходит такая ошибка. Не подскажите в чем дело? #1452 - Cannot add or update a child...

Ошибка при добавлении данных в таблицу
Здравствуйте. Недавно начал изучать Entity Framework. Может кто поможет решить мою проблему. Есть проект WPF в него добавляю локальную...

Ошибка при добавлении данных в таблицу
Подскажите с чем связана данная ошибка?

Ошибка при добавлении данных в таблицу
Выбрасывает такую ошибку при записи в таблицу SQL.Add('insert into parent...

Ошибка при добавлении данных в таблицу БД
Здравствуйте! У меня имеется страничка ASP, которая работает с БД через модель ADO.NET. На странице я выбираю файл с ПК, пишу его...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru