Что-то не так с функцией выполнения запроса этого класса базы данных? - PullRequest
0 голосов
/ 31 августа 2011

Итак, я использую этот старый код, который запускает простую команду ExecuteNonQuery для вызовов базы данных. Я использую DbConnection, DbTransaction и другие команды System.Data.Common.

Кажется, я получаю много ошибок Null Reference всякий раз, когда использую функцию в определенных частях проекта, хотя в других частях это кажется нормальным. Я думаю, что это связано с открытием соединений вручную или какой-то проблемой с вызовом, но мне интересно, изначально ли сама функция плохо спроектирована (не должен ли быть способ исправить какие-либо проблемы в том, как она вызывается?)

Я чувствую, когда в транзакциях участвуют эти ошибки с нулевой ссылкой чаще, я думаю, что ошибка, которую я получаю, является нулевым исключением при "_ command = _db.GetStoredProcCommand (StoreProcedure);" внутри следующей функции , Но эта хранимая процедура существует, поэтому она не имеет смысла.

public List<OutputParameter> execute(String storedProcedure, StoredProcedureParameter[] sqlParameters)
{
  try
  {
      List<OutputParameter> outputParameters = new List<OutputParameter>();
      _command = _db.GetStoredProcCommand(storedProcedure);

    for (int x = 0; x < sqlParameters.GetLength(0); x++)
    {
      if (sqlParameters[x] != null)
      {
        StoredProcedureParameter sqlParameter = sqlParameters[x];
        String param = sqlParameter.ParameterName;

        DbType dbType = sqlParameter.DbType;
        object value = sqlParameter.Value;
        if (sqlParameter.IsOutputParam)
        {
          _db.AddOutParameter(_command, param, dbType, 32);

          OutputParameter outputParameter = new OutputParameter(param);
          outputParameters.Add(outputParameter);
        }
        else
          _db.AddInParameter(_command, param, dbType, value);
      }
    }
    if (_transaction == null)
      _db.ExecuteNonQuery(_command);
    else
      _db.ExecuteNonQuery(_command, _transaction);

    foreach (OutputParameter op in outputParameters)
    {
      op.ParameterValue = _db.GetParameterValue(_command, op.ParameterName);
    }

    return outputParameters;
  }
  catch (SqlException sqle)
  {
    throw new DataAccessException(sqle.ToString());
  }
  catch (Exception e)
  {
    throw new DataAccessException(e.ToString());
  }
}

Ответы [ 2 ]

2 голосов
/ 31 августа 2011

Ваша переменная _command выглядит как поле и как таковой общий член.

Таким образом, ваш код очень подвержен многопоточным проблемам (если две функции вызывают этот класс сразличные хранимые процедуры, что происходит?).

A Command также должны быть закрыты и утилизированы должным образом, что не происходит в вашем коде, в любом случае явно.

1 голос
/ 31 августа 2011

Если вы получаете исключение нулевой ссылки в строке _command = _db.GetStoredProcCommand(storedProcedure);, то единственное, что может быть нулевым, - это _db. ХранимаяProcedure - это просто параметр, и _command может без проблем быть нулевым.

Так как вы на самом деле ничего не делаете в коде, чтобы убедиться, что _db существует и является действительным, открытым и т. Д., То это, скорее всего, проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...