/// <summary>
        /// Encapsula uma exceção em uma <see cref="ConnectorException"/>.
        /// Se possível, faz a interpretação da mensagem e preenche o campo
        /// <see cref="Type"/>.
        /// </summary>
        /// <param name="ex">A exceção a ser encapsulada</param>
        /// <returns>A nova ConnectorException.</returns>
        public static ConnectorException FromDatabaseException(Exception ex)
        {
            string s   = ex.Message;
            string msg = s;

            ConnectorExceptionType t = ConnectorExceptionType.Other;
            Match m;

            if ((m = rxDelete.Match(s)).Success)
            {
                t   = ConnectorExceptionType.ForeignKeyViolation;
                msg = Strings.FormatString("Data.Connector.Exception.FKViolation", "(null)");
            }
            else if ((m = rxInsert.Match(s)).Success)
            {
                t = ConnectorExceptionType.ForeignKeyViolation;
            }
            else if ((m = rxPrimaryKey.Match(s)).Success)
            {
                t   = ConnectorExceptionType.PrimaryKeyViolation;
                msg = Strings.FormatString("Data.Connector.Exception.PKViolation", m.Groups["t"]);
            }
            else if ((m = rxUnique.Match(s)).Success)
            {
                t   = ConnectorExceptionType.UniqueConstraintViolation;
                msg = Strings.FormatString("Data.Connector.Exception.UniqueViolation", m.Groups["t"]);
            }

            return(new ConnectorException(t, msg, ex));
        }
        /// <summary>
        /// Utilizado no suporte a serialização.
        /// </summary>
        protected ConnectorException(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
            string p = GetType().FullName;

            this.type     = (ConnectorExceptionType)info.GetInt32(p + ".type");
            this.sqlQuery = info.GetString(p + ".sql");
        }
 private static string FormatMessage(ConnectorExceptionType t, string msg)
 {
     if (t == ConnectorExceptionType.Other)
     {
         return(msg);
     }
     else
     {
         return(String.Format("[{0}] {1}", t, msg));
     }
 }
		/// <summary>
		/// Utilizado no suporte a serialização.
		/// </summary>
		protected ConnectorException(SerializationInfo info, StreamingContext context)
			: base(info, context)
		{
			string p = GetType().FullName;
			this.type = (ConnectorExceptionType) info.GetInt32(p + ".type");
			this.sqlQuery = info.GetString(p + ".sql");
		}
		/// <summary>
		/// Cria uma nova exceção do <see cref="IConnector"/>.
		/// </summary>
		/// <param name="type">O tipo de exceção, caso seja de um tipo específico</param>
		/// <param name="innerException">A exceção que é causa desta</param>
		public ConnectorException(ConnectorExceptionType type, Exception innerException)
			: this(type, innerException.Message, innerException) { }
		/// <summary>
		/// Cria uma nova exceção do <see cref="IConnector"/>.
		/// </summary>
		/// <param name="type">O tipo de exceção, caso seja de um tipo específico</param>
		/// <param name="msg">A mensagem de erro</param>
		/// <param name="innerException">A exceção que é causa desta</param>
		public ConnectorException(ConnectorExceptionType type, string msg, Exception innerException)
			: base(FormatMessage(type, msg), innerException)
		{
			this.type = type;
		}
		private static string FormatMessage(ConnectorExceptionType t, string msg)
		{
			if (t == ConnectorExceptionType.Other)
				return msg;
			else
				return String.Format("[{0}] {1}", t, msg);
		}
 /// <summary>
 /// Cria uma nova exceção do <see cref="IConnector"/>.
 /// </summary>
 /// <param name="type">O tipo de exceção, caso seja de um tipo específico</param>
 /// <param name="innerException">A exceção que é causa desta</param>
 public ConnectorException(ConnectorExceptionType type, Exception innerException)
     : this(type, innerException.Message, innerException)
 {
 }
 /// <summary>
 /// Cria uma nova exceção do <see cref="IConnector"/>.
 /// </summary>
 /// <param name="type">O tipo de exceção, caso seja de um tipo específico</param>
 /// <param name="msg">A mensagem de erro</param>
 /// <param name="innerException">A exceção que é causa desta</param>
 public ConnectorException(ConnectorExceptionType type, string msg, Exception innerException)
     : base(FormatMessage(type, msg), innerException)
 {
     this.type = type;
 }