2010-05-09 5 views
0

쿼리 매개 변수로 Int32에 대한 0부터 시작하는 Enum 캐스트의 첫 번째 항목을 사용할 때 매개 변수 값은 null입니다. 첫 번째 항목의 값을 1로 설정하여이 문제를 해결했지만 실제로 진행되는 작업이 무엇인지 궁금합니다. 이건 내 머리를 긁적이다. 매개 변수 값이 0 대신 null로 간주되는 이유는 무엇입니까?열거 형 항목 0이 Int32를 사용하여 캐스트 될 때 쿼리 매개 변수 값이 Null입니다.

Enum LogEventType : int 
{ 
    SignIn, 
    SignInFailure, 
    SignOut, 
    ... 
} 

private static DataTable QueryEventLogSession(DateTime start, DateTime stop) 
{ 
    DataTable entries = new DataTable(); 

    using (FbConnection conn = new FbConnection(DSN)) 
    { 
     using (FbDataAdapter adapter = new FbDataAdapter(
      "SELECT event_type, event_timestamp, event_details FROM event_log " + 
      "WHERE event_timestamp BETWEEN @start AND @stop " + 
      "AND event_type IN (@signIn, @signInFailure, @signOut) " + 
      "ORDER BY event_timestamp ASC", conn)) 
     { 
      adapter.SelectCommand.Parameters.AddRange(new Object[] { 
       new FbParameter("@start", start), 
       new FbParameter("@stop", stop), 
       new FbParameter("@signIn", (Int32)LogEventType.SignIn), 
       new FbParameter("@signInFailure", (Int32)LogEventType.SignInFailure), 
       new FbParameter("@signOut", (Int32)LogEventType.SignOut)}); 

      Trace.WriteLine(adapter.SelectCommand.CommandText); 
      foreach (FbParameter p in adapter.SelectCommand.Parameters) 
      { 
       Trace.WriteLine(p.Value.ToString()); 
      } 

      adapter.Fill(entries); 
     } 
    } 
    return entries; 
} 
+0

int로 캐스트 된 첫 번째 매개 변수는 null이 아니고 0이어야합니다. 이것이 문제가 확실합니까? –

+0

예. 'Trace.WriteLine (p.Value.ToString());'는 SignIn의 NullReferenceException을 던집니다. 예외 대신에 나는 0을 프린트 할 것으로 기대한다. – Timothy

+0

무엇이'FbParameter'인가? 널 (NULL)로 가정합니까? 캐스트를 사용하지 않으면 어떻게 될까요? '(Int32)'에 대한 호출을 제거해보십시오. – shahkalpesh

답변

1

이 API는 모르지만 버그 일 수 있습니다. params를 정의 할 때 FbDbType 열거 형을 전달하십시오.

http://www.firebirdsql.org/dotnetfirebird/documentation/api/1.7/FirebirdSql.Data.Firebird.FbDbType.html

http://www.firebirdsql.org/dotnetfirebird/documentation/api/1.7/FirebirdSql.Data.Firebird.FbParameter.html

다른 옵션은 하나씩 parameter 가산 대신 객체 어레이와 AddRange 방법을 이용하려고하는 것이다.

+0

도와 주셔서 감사합니다. 'adapter.SelectCommand.Parameters.Add ("@ signIn", FbDbType.Integer) .Value = (Int32) LoggerEventType.SignIn;은 의도 한대로 작동합니다. 나는 그것이 버그 일 것임에 틀림 없다. – Timothy