2011-08-31 2 views
0

그래서이 오래된 코드를 사용하여 데이터베이스 호출에 대해 간단한 ExecuteNonQuery 명령을 실행합니다. DbConnection, DbTransaction 및 다른 System.Data.Common 명령을 사용하고 있습니다.이 데이터베이스 클래스의 쿼리 실행 함수에 문제가 있습니까?

다른 부분에서는 잘 보이지만 프로젝트의 특정 부분에서이 기능을 사용할 때마다 Null 참조 오류가 많이 발생하는 것처럼 보입니다. 나는 수동으로 연결을 열거 나 호출하는 것과 관련이 있다고 생각하지만, 함수 자체가 잘못 설계된 것인지 궁금하다. (호출되는 방식으로 문제를 해결할 수있는 방법이 없어야 하는가?)

트랜잭션이 관련되어있을 때 이러한 null 참조 오류가 더 자주 발생한다고 생각합니다. 오류가 발생하는 경우 null 예외가 발생합니다. "_command = _db.GetStoredProcCommand (storedProcedure);"은 다음 기능 내에 있습니다. 그러나 저장 프로 시저가 존재하므로 이해가되지 않습니다.

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()); 
    } 
} 
+0

'_command'는 어디에 정의되어 있습니까? 어디에서 액세스 할 수 있습니까? – Oded

+0

개인 DbCommand _command = null; ---이 GetStoredProcCommand 물건을 제외하고 시작된 것은 아닙니다. QueryDatabase() 같은 다른 함수에서 액세스합니다. execute()와 같이 실행하는 대신 결과를 가져옵니다. – Dexter

+0

그리고 몇 군데에 액세스하고 있습니까? 코드의 여러 부분에서'execute'를 사용하고 있습니까? – Oded

답변

2

귀하의 _command 변수는 필드 것으로 보인다 및 공유 구성원으로.

마찬가지로 코드는 입니다. 멀티 스레딩 문제가 발생할 수 있습니다. 두 클래스가 다른 저장 프로 시저로이 클래스를 호출하면 어떻게됩니까?

Command도 명시 적으로 명시 적으로 명시된 것이 아니라 코드에서 올바르게 처리 및 폐기해야합니다.

+0

asp.net과 웹 사이트가 일반적으로 매우 직선적이어서 POSIX 함수를 사용하지 않는 한 PHP에 멀티 스레딩이 없기 때문에 아무 것도 멀티 스레드되지 않도록합니다. Lemme 맞아, 내가 틀렸어? 그렇다면이 문제를 해결하기 위해 어떻게 코딩해야합니까? 개인 변수가 아니라 'using'을 사용하는 지역 변수를 더 많이 사용해야합니까? – Dexter

+0

@Dexter - asp.net에 스레드를 추가하는 것은 매우 쉽습니다. 따라서 코드가 완전히 격리 된 단일 스레드에서만 실행될 것이라고 가정하면 문제가 발생할 수 있습니다. 당신은'using' 문과 함께 head - local 변수에서 못을 쳤습니다. – Oded

+0

그래도 문제가 해결되지 않았습니다. _conn 또는 _command와 같은 다른 값이 null 일 수 있습니다. 데이터 액세스 클래스 생성 생성시 초기화되는 클래스 : public DataAccess() { _db = DatabaseFactory.CreateDatabase(); _conn = _db.CreateConnection(); } – Dexter

1

_command = _db.GetStoredProcCommand(storedProcedure); 줄에 Null 참조 예외가있는 경우 null이 될 수있는 유일한 것은 _db입니다. storedProcedure는 매개 변수 일 뿐이며 _command는 문제없이 null이 될 수 있습니다.

코드에서 _db가 있고 유효하고 열려 있는지 등을 확인하기 위해 실제로 아무 것도하지 않으므로이 문제가 발생할 가능성이 큽니다.

+0

다음과 같은 문제가 있습니다. if (da.getConnectionState() == ConnectionState.Closed) da.openConnection(); 코드의 일부 영역에서 오류가 발생했습니다. 누군가 자동으로 관리되기 때문에 연결을 수동으로 여는 것은 잘못된 것이라고 나에게 말했기 때문에 열린 연결을 제거했습니다. 그리고 그것은 많은 문제를 해결했습니다. (여전히 여기에 코드가 남아 있습니다.) _db는 클래스가 초기화 될 때 초기화됩니다. _db = DatabaseFactory.CreateDatabase(); – Dexter

관련 문제