try
{
// do your insert
}
catch(Exception ex)
{
if (ex.GetBaseException().GetType() == typeof(SqlException))
{
Int32 ErrorCode = ((SqlException)ex.InnerException).Number;
switch(ErrorCode)
{
case 2627: // Unique constraint error
break;
case 547: // Constraint check violation
break;
case 2601: // Duplicated key row error
break;
default:
break;
}
}
else
{
// handle normal exception
}
}
Я видел это на другом сообщении и бесстыдно украл его и использовал его в большой части моего кода с тех пор:
public delegate void MyClickHandler(object sender, string myValue);
public event MyClickHandler Click = delegate {}; // add empty delegate!
//Let you do this:
public void DoSomething() {
Click(this, "foo");
}
//Instead of this:
public void DoSomething() {
if (Click != null) // Unnecessary!
Click(this, "foo");
}
<забастовка> *, Если кто-либо знает источник этой техники, отправьте его в комментариях. Я действительно верю в источник, получая подлежащий выплате кредит.
( Редактирование: я получил его из этого сообщения Скрытые Функции C#? )
Можно записать, как:
MyEvent += delegate { };
я не уверен, что Вы хотите сделать, исправить.
Нотация:
if ( MyEvent != null ) {
MyEvent( param1, param2 );
}
не ориентировано на многопотоковое исполнение. Необходимо сделать это этот путь:
EventHandler handler = this.MyEvent;
if ( null != handler ) { handler( param1, param2 ); }
я понимаю, что это - беспокойство, таким образом, можно сделать вспомогательный метод:
static void RaiseEvent( EventHandler handler, object sender, EventArgs e ) {
if ( null != handler ) { handler( sender, e ); }
}
и затем звоните:
RaiseEvent( MyEvent, param1, param2 );
при использовании C# 3.0 можно объявить вспомогательный метод как дополнительный метод:
static void Raise( this EventHandler handler, object sender, EventArgs e ) {
if ( null != handler ) { handler( sender, e ); }
}
и затем звоните:
MyEvent.Raise( param1, param2 );
Также можно создать следующее расширение/вспомогательные методы для других обработчиков событий. Например:
static void Raise<TEventArgs>( this EventHandler<TEventArgs> handler,
object sender, TEventArgs e ) where TEventArgs : EventArgs
{
if ( null != handler ) { handler( sender, e ); }
}
Это - плохая идея в этом код, который использует событие, теперь имеет ожидание, что объект с событием был кодирован с действием по умолчанию. Если Ваш код никогда не будет используемым больше нигде никем больше тогда, что я предполагаю, что можно выйти сухим из воды.
Вам не нужны несколько дополнительных методов для различных обработчиков событий, Вам просто нужен тот:
public static class EventHandlerExtensions {
public static void Raise<T>(this EventHandler<T> handler, object sender, T args) where T : EventArgs {
if (handler != null) handler(sender, args);
}
}
Вы можете использовать PostSharp, чтобы во время сборки добавить это волшебство. Это лучший способ.