powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Исключение при работе с БД
16 сообщений из 16, страница 1 из 1
Исключение при работе с БД
    #35757426
Фотография akf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть класс для работы с БД MSSQL 2005. Всё работает, сохраняется. С виду всё корректно.
Но в закладке Output внизу студии (я так понимаю, что это просто Console) появляются сообщения
Код: plaintext
A first chance exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll
При этом как я говорил, в базу все данные сохраняются.

Попробовал погуглить - фиг! на такой запрос всего 4 страницы находятся. Да и те без ответов, один такие же вопросы.

Кто-нибудь может подсказать, хотя бы где капать?

Правило сроков выполнения проекта (90 на 90). Первые 90% работы отнимают 10% времени, а последние 10% - оставшиеся 90% времени.
...
Рейтинг: 0 / 0
Исключение при работе с БД
    #35757490
Фотография akf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прияём все обновления в БД заключены в try/catch:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
try
{
      ХарактеристикиБД_TA.Update(ХарактеристикиБД_DT);
}
catch (Exception ex)
{
      SysLOGW("Ошибка при сохранении данных в \"Характеристики БД\": " + ex.Message);
}

Но в эти исключения не вываливается
...
Рейтинг: 0 / 0
Исключение при работе с БД
    #35757550
vagner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте следующее:
1. Выберите конфигурацию Debug.
2. Меню Debug->Exceptions->включите все галочки.
3. Запустите программу. При первом же исключении программа остановится.
...
Рейтинг: 0 / 0
Исключение при работе с БД
    #35757586
Фотография akf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vagner, спасибо помогло. сразу же появилось сообщение
Код: plaintext
1.
Violation of PRIMARY KEY constraint 'PK_Измеренные значения за месяц_NEW'. Cannot insert duplicate key in object 'dbo.Измеренные значения за месяц'.
The statement has been terminated.
Причём ВНУТРИ try:
try
{
ValuesPerMonthAdapter.Update(ValuesPerMonthDB);
}
catch (Exception ex)
{
SysLOGW("Ошибка при сохранении данных в \"Измеренные значения за месяц\": " + ex.Message);
}

Буду TableAdaper лечить
...
Рейтинг: 0 / 0
Исключение при работе с БД
    #35757597
vagner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выходит, исключения "отлавливаются" внутри ValuesPerMonthAdapter.Update.
...
Рейтинг: 0 / 0
Исключение при работе с БД
    #35757615
vagner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если это Ваш метод, то могу предположить следующее:
Имеет место конструкция:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
try
{
  // some code
}
finally
{
  // some code
}
Я одно время применял такое в надежде в случае исключения освободить ресурсы, а исключение доверить обработать верхнему уровню, но оказалось, что исключения просто тупо гасились.
Пришлось перейти на:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
try
{
  // some code
}
catch
{
  throw;
}
finally
{
  // some code
}
...
Рейтинг: 0 / 0
Исключение при работе с БД
    #35757632
Фотография akf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Update не мой, а генерированный DataSet'ом в xsd
...
Рейтинг: 0 / 0
Исключение при работе с БД
    #35757636
Фотография akf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я просто изначально наивно думал, что стандартный Update решит все проблемы с проверкой на сущемствование записи с такими ключами. Ан нет, вот это исключени как раз оттуда.

Правило сроков выполнения проекта (90 на 90). Первые 90% работы отнимают 10% времени, а последние 10% - оставшиеся 90% времени.
...
Рейтинг: 0 / 0
Исключение при работе с БД
    #35757726
Фотография akf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема оказалась в том, что я из базы никогда не беру данные, а только пишу. И циклично очищаю, чтобы не загружать память, а потом заполняю DataTable данным из программы.
Поэтому все строки, которые я пытаюсь вставить в БД являются для неё новыми , если я правильно выражаюсь. И выскакивает исключение.

Теперь надо реализовать проверку на существование текущих записей из DataTable в БД..

Правило сроков выполнения проекта (90 на 90). Первые 90% работы отнимают 10% времени, а последние 10% - оставшиеся 90% времени.
...
Рейтинг: 0 / 0
Исключение при работе с БД
    #35757748
vagner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может,
Код: plaintext
1.
foreach ( DataRow dr in myDataTable.Rows ) dr.SetModified ( );
спасет?

PS Сам никогда не пробовал :)
...
Рейтинг: 0 / 0
Исключение при работе с БД
    #35757759
vagner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя, возможно, так можно "пропустить" действительно новые строки.
Довольно странная у Вас архитектура: в БД пишете, но не читаете. Понимаю, что для других, но почему бы и самому не читать?
...
Рейтинг: 0 / 0
Исключение при работе с БД
    #35757782
Фотография akf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vagnerХотя, возможно, так можно "пропустить" действительно новые строки.
Довольно странная у Вас архитектура: в БД пишете, но не читаете. Понимаю, что для других, но почему бы и самому не читать?

Таблица со значениями с датчиков - значение раз в минуту примерно - 70 датчиков. Только с марта по ноября набежало больше 150 000 строк. И хранить их в памяти? :)
...
Рейтинг: 0 / 0
Исключение при работе с БД
    #35757788
Фотография akf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а читаются эти показания потом этим же классом, но совершенно для других целей (отчёты, например)
...
Рейтинг: 0 / 0
Исключение при работе с БД
    #35757799
Фотография akf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vagnerМожет,
Код: plaintext
1.
foreach ( DataRow dr in myDataTable.Rows ) dr.SetModified ( );
спасет?

PS Сам никогда не пробовал :)

Не спасёт, т.к. у меня
Код: plaintext
RowState = Added
у этих строк.
Есть идея. Реализую - выложу - покритикуете
...
Рейтинг: 0 / 0
Исключение при работе с БД
    #35757835
vagner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильно, added. Вот я и предлагаю пробежаться по всем строкам и изменить их состояние.
...
Рейтинг: 0 / 0
Исключение при работе с БД
    #35757915
Фотография akf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.к. строк для обновления не много ра раз - решил сделать через временную таблицу workTable :

Код: plaintext
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.
string sqlTable = ValuesPerMonthDB.TableName ;

                    // Prepare connection
                    SqlConnection connection = new SqlConnection(SarkWinPRG.Properties.Settings.Default.SARKConnectionString);

                    DataTable _table = ValuesPerMonthDB;
                    SqlDataAdapter da;
                    DataTable workTable = ValuesPerMonthDB.Clone();

                    // Get keys for target table
                    String sqlKeys = "EXEC sp_pkeys @table_name = '" + sqlTable + "'";

                    da = new SqlDataAdapter(sqlKeys, connection);
                    DataTable KeyColumns = new DataTable();
                    try
                    {
                        da.Fill(KeyColumns);
                    }
                    catch { }
                    if (KeyColumns.Rows.Count > 0)
                        foreach (DataRow row in _table.Rows)
                        {
                            String sqlCmd = "SELECT * FROM dbo.[" + sqlTable + "] WHERE ";
                            foreach (DataRow keyRow in KeyColumns.Rows)
                            {
                                String colName = keyRow["COLUMN_NAME"].ToString();
                                Type colType = _table.Columns[colName].DataType;
                                if (colType == typeof(String))
                                {
                                    sqlCmd += "[" + colName + "] = '" + row[colName].ToString() + "' AND ";
                                }
                                else if (colType == typeof(DateTime))
                                {
                                    String date = ((DateTime)row[colName]).ToString("u");
                                    date = date.Substring(0, date.Length - 1);
                                    sqlCmd += "[" + colName + "] = CONVERT(datetime, '" + date + "', 102) AND ";
                                }
                                else
                                {
                                    sqlCmd += "[" + colName + "] = " + row[colName].ToString() + " AND ";
                                }
                            }
                            sqlCmd = sqlCmd.Substring(0, sqlCmd.Length - 5);
                            da = new SqlDataAdapter(sqlCmd, connection);
                            try
                            {
                                da.Fill(workTable);    // fill table with old row
                            }
                            catch { }
                        }


                    foreach (DataRow row in _table.Rows)
                        workTable.LoadDataRow(row.ItemArray, false);
                    // Prepare DataAdapter for database update
                    da = new SqlDataAdapter("SELECT * FROM dbo.[" + sqlTable + "]", connection);
                    SqlCommandBuilder cb = new SqlCommandBuilder(da);
                    try
                    {
                        da.UpdateCommand = cb.GetUpdateCommand();
                        da.InsertCommand = cb.GetInsertCommand();
                        da.DeleteCommand = cb.GetDeleteCommand();
                        // Update SQL database
                        da.ContinueUpdateOnError = true;
                        da.Update(workTable);
                    }
                    catch (SqlException e)
                    {
                        SysLOGW("SQL error: "+ e.Message);
                    }
                    catch (InvalidOperationException e)
                    {
                        SysLOGW("The input table is invalid. SQL error: " + e.Message);
                    }
                    catch (DBConcurrencyException e)
                    {
                        SysLOGW("Concurrency error - An attempt to execute an INSERT, UPDATE, or DELETE statement resulted in zero records affected. SQL error: " + e.Message);
                    }
                    catch (SystemException e)
                    {
                        SysLOGW("SQL error: " + e.Message);
                    }


Модератор: Тема перенесена из форума "C#.NET".
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Исключение при работе с БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]