Почему Sql Server возвращает один и тот же код ошибки для каждого исключения в asp.net?

Я создаю веб-сайт asp.net, на котором мне нужно отслеживать различные исключения, такие как дублирование электронной почты пользователя или данные, вставленные или нет, или исключения внешнего ключа, но sql server 2016 всегда возвращает код ошибки -2146232060. Я слышал о повторяющемся коде ошибки 2206 или что-то в этом роде.

Это мой класс .DBManager, который я использовал для вставки или извлечения данных.

class DBManager : IDisposable
{
    private DbConnection con;
    private DbCommand command;

    public DBManager() : this("DefaultConnection") { }

    public DBManager(string connectionStringName)
    {
        string connectionString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
        con = new SqlConnection(connectionString);
    }

    public int ExecuteNonQuery()
    {
        int result;

        if (command == null)
        {
            return -5;
        }

        try
        {
            con.Open();
            result = command.ExecuteNonQuery(); 
        }
        catch (DbException ex)
        {
            result = ex.ErrorCode;
        }
        finally
        {
            con.Close();
        }

        return result;
    }

    public DataTable ExecuteDataTable()
    {
        DataTable dt = new DataTable();
        SqlDataAdapter da;

        if (command == null)
        {
            return dt;
        }

        try
        {
            da = new SqlDataAdapter();
            con.Open();
            da.SelectCommand = (SqlCommand) command;
        }
        finally
        {
            con.Close();
        }

        da.Fill(dt);
        return dt;
    }

    public object ExecuteScalar()
    {
        object result;

        if (command == null)
        {
            return -5;
        }

        try
        {
            con.Open();
            result = command.ExecuteScalar();
        }
        catch (DbException ex)
        {
            result = ex.ErrorCode;
        }
        finally
        {
            con.Close();
        }

        return result;
    }

    public DataSet ExecuteDataSet()
    {
        DataSet ds = new DataSet();

        if (command == null)
        {
            return ds;
        }

        try
        {
            con.Open();
            DbDataAdapter ad = new SqlDataAdapter((SqlCommand)command);
            ad.Fill(ds);
        }
        finally
        {
            con.Close();
        }

        return ds;
    }

    public void SetSqlStringCommand(string commandText)
    {
        command = GetCommand(commandText, CommandType.Text);
    }

    public void SetStoredProcedureCommand(string commandText)
    {
        command = GetCommand(commandText, CommandType.StoredProcedure);
    }

    private DbCommand GetCommand(string commandText, CommandType commandType)
    {
        DbCommand command = con.CreateCommand();
        command.CommandType = commandType;
        command.CommandText = commandText;
        return command;
    }

    public void AddInParameter(string name, DbType dbType, object value)
    {
        if (command != null)
        {
            AddParameter(command, name, dbType, value, ParameterDirection.Input, 0);
        }

        else
        {
            throw new ArgumentException("Command cannot be null");
        }
    }

    public void AddOutParameter(string name, DbType dbType, int size)
    {
        if (command != null)
        {
            AddParameter(command, name, dbType, null, ParameterDirection.Output, size);
        }

        else
        {
            throw new ArgumentException("Command cannot be null");
        }
    }

    private void AddParameter(DbCommand command, string name, DbType dbType, object value, 
        ParameterDirection direction, int size)
    {
        var parameter = command.CreateParameter();
        parameter.ParameterName = name;
        parameter.DbType = dbType;
        parameter.Value = value ?? DBNull.Value;
        parameter.Direction = direction;

        if (size > 0)
        {
            parameter.Size = size;
        }

        command.Parameters.Add(parameter);
    }

    public void Dispose()
    {
        if (command != null)
        {
            command.Dispose();
            command = null;
        }

        if (con != null)
        {
            con.Dispose();
            con = null;
        }
    }
}

Это потому, что я использую класс DbConnection вместо SqlConnection?


person Hafiz Hamza    schedule 06.02.2018    source источник
comment
Вам нужно изучить .Number SqlException для кода ошибки сервера. (Кроме того, адаптеры/столы также требуют утилизации)   -  person Alex K.    schedule 06.02.2018
comment
код ошибки, который вы получаете, — 0x80131904, и уже есть вопрос относится к этому здесь, в stackoverflow, который может вам помочь.   -  person cosh    schedule 06.02.2018
comment
0x80131904, по-видимому, является HRESULT, используемым для всех ошибок SQL Server. Вам нужно будет посмотреть на другие свойства экземпляра исключения, чтобы увидеть, какая у вас ошибка.   -  person Richard    schedule 06.02.2018
comment
как я могу проверить другие свойства экземпляра исключения?   -  person Hafiz Hamza    schedule 06.02.2018
comment
1. Используйте отладчик – установите точку останова на catch; 2. включите по крайней мере свойство Message в свою диагностику, 3. не перехватывайте исключение без повторного создания, если вы эффективно не обработали исключение.   -  person Richard    schedule 06.02.2018
comment
Поскольку это похоже на класс, предназначенный для обработки вашей базы данных, у вас не должно быть НИКАКИХ блоков try/catch. Если библиотека обнаруживает ошибку, эта ошибка ДОЛЖНА вернуться в вызывающую программу. Вы также можете рассматривать оператор USING как гораздо более чистый и безопасный способ обработки ваших подключений и других объектов, наследующих IDisposable.   -  person Sean Lange    schedule 06.02.2018