- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
/// <summary>
/// Обновление данных о объекте
/// </summary>
/// <param name="theObject">ссылка на объект</param>
public void Update(IPersistentObject theObject)
{
IDbCommand updateCommand = null;
try
{
using (updateCommand = CreateUpdateCommand(theObject))
{
updateCommand.Connection.Open();
updateCommand.ExecuteNonQuery();
}
}
catch (DbException ex)
{
int code = 0;
if (ex is SqlException)
{
code = ((SqlException) ex).Number;
}
if (code == 229)
{
ex.Data.Add("Name", theObject.ClassInfo.Name);
ex.Data.Add("Description", theObject.ClassInfo.Description);
ex.Data.Add("Action", "UPDATE");
throw new InvalidOperationException(
String.Format("Ошибка обновления объекта [{0}] - {1} (ID = '{2}')",
theObject.ClassInfo.Name,
theObject.ClassInfo.Description,
theObject.ID), ex);
}
if (code == 207 || code == 208)
{
throw new InvalidColumnException(theObject.ClassInfo, ex);
}
//theObject заменен на theObject.ID. Нечитабельно, но ... Т. к. при вычислении ToString()
//для показа объекта иногда задействуются методы загрузки данных
//названия объекта. Таким образом при высоком уровне изоляции транзакции
//мы получим зависание если будет попытка загрузить данные заблокированные транзакцией.
TraceLogger.Log(String.Format("Update {0}({1}){4} - {2}\n{3}", theObject.ID, theObject.ClassInfo,
ex.Message, ex.InnerException, theObject.GetInfoToTraceMessage()),
TraceTypeEnum.UpdateStatement);
throw;
}
finally
{
if (updateCommand != null)
{
updateCommand.Connection.Close();
}
}
}
Lokich 10.07.2015 11:44 # 0
vldalx 10.07.2015 12:21 # 0
> using и finally вполне себе
приведенный код аналогичен
IDbCommand updateCommand = null;
try
{
try
{
updateCommand = CreateUpdateCommand(theObject)
updateCommand.Connection.Open();
updateCommand.ExecuteNonQuery();
}
finally
{
if (updateCommand != null)
{
updateCommand.Dispose();
}
}
}
catch (DbException ex)
{
....
}
finally
{
if (updateCommand != null)
{
updateCommand.Connection.Close();
}
}
вызов Dispose() у DbCommand закрывает Connection (или тут у меня проблемы с мат. частью)
ЗЫ тоже самое здесь говорят http://stackoverflow.com/questions/1423391/will-dbcommand-close-close-the-connection-as-well
1024-- 10.07.2015 12:32 # 0
vldalx 10.07.2015 12:37 # 0
kegdan 10.07.2015 13:27 # 0
igorkrets 21.11.2015 13:34 # 0