Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Исключение при работе с БД / 16 сообщений из 16, страница 1 из 1
14.01.2009, 15:10
    #35757426
akf
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
14.01.2009, 15:38
    #35757490
akf
akf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при работе с БД
Прияём все обновления в БД заключены в try/catch:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
try
{
      ХарактеристикиБД_TA.Update(ХарактеристикиБД_DT);
}
catch (Exception ex)
{
      SysLOGW("Ошибка при сохранении данных в \"Характеристики БД\": " + ex.Message);
}

Но в эти исключения не вываливается
...
Рейтинг: 0 / 0
14.01.2009, 15:57
    #35757550
vagner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при работе с БД
Попробуйте следующее:
1. Выберите конфигурацию Debug.
2. Меню Debug->Exceptions->включите все галочки.
3. Запустите программу. При первом же исключении программа остановится.
...
Рейтинг: 0 / 0
14.01.2009, 16:04
    #35757586
akf
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
14.01.2009, 16:08
    #35757597
vagner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при работе с БД
Выходит, исключения "отлавливаются" внутри ValuesPerMonthAdapter.Update.
...
Рейтинг: 0 / 0
14.01.2009, 16:12
    #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
14.01.2009, 16:17
    #35757632
akf
akf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при работе с БД
Update не мой, а генерированный DataSet'ом в xsd
...
Рейтинг: 0 / 0
14.01.2009, 16:18
    #35757636
akf
akf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при работе с БД
Я просто изначально наивно думал, что стандартный Update решит все проблемы с проверкой на сущемствование записи с такими ключами. Ан нет, вот это исключени как раз оттуда.

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

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

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

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

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

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

Не спасёт, т.к. у меня
Код: plaintext
RowState = Added
у этих строк.
Есть идея. Реализую - выложу - покритикуете
...
Рейтинг: 0 / 0
14.01.2009, 17:24
    #35757835
vagner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при работе с БД
Правильно, added. Вот я и предлагаю пробежаться по всем строкам и изменить их состояние.
...
Рейтинг: 0 / 0
14.01.2009, 17:48
    #35757915
akf
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
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Исключение при работе с БД / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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