2013-05-24 7 views
-1

나는 왜 이런 일이 발생하는지 잘 모르겠습니다. 나는 온라인으로 같은 문제를 보았고 그것을 해결할 수있는 도움이 거의 없었다.ExecuteScalar는 항상 0을 반환합니다.

Access에서 쿼리를 실행할 때 0에서 10까지 다른 값을 갖지만 어떤 이유로 인해 코드에서 동일한 값을 반환하지 않습니다.

static int OrdersPerHour(string User) 
    { 
     int? OrdersPerHour = 0; 
     OleDbConnection conn = new OleDbConnection(strAccessConn); 
     DateTime curTime = DateTime.Now; 


     try 
     { 

      string query = "SELECT COUNT(ControlNumber) FROM Log WHERE DateChanged > #" + curTime.AddHours(-1) + "# AND User = '" + User + "' AND Log.EndStatus in ('Needs Review', 'Check Search', 'Vision Delivery', 'CA Review', '1TSI To Be Delivered');"; 
      OleDbCommand dbcommand = new OleDbCommand(query, conn); 
      dbcommand.Connection.Open(); 
      dbcommand.CommandType = CommandType.Text; 
      dbcommand.CommandText = query; 
      OrdersPerHour = (int?)dbcommand.ExecuteScalar(); 


         } 
     catch (OleDbException ex) 
     { 

     } 
     finally 
     { 
      conn.Close(); 
     } 
     return OrdersPerHour.Value; 

    } 
+0

마크 아웃의 서식을 향상 시키려면 편집하고 싶을 수 있습니다. 또한 try {} 안에이 코드 중 일부가 있다는 뜻입니까? –

+1

매개 변수를 사용하십시오 ... SQL 삽입은 매우 현실입니다 –

+0

1.) [Parameterized Queries] (http://en.wikipedia.org/wiki/SQL_injection)를 사용하십시오. 2.) 왜 당신은 비어있는'Try Catch Finally'를 가지고 있습니까? 연결이 닫혀 있는지 확인하는 것입니까? 'using' 문에'OleDbConnection'을 써야합니다. –

답변

3

sql 명령을 작성하기 위해 문자열 연결 및 Access 구문을 사용하지 마십시오.
올바르게 값이 데이터베이스 요구 사항에 따라 날짜, 소수 문자열을 포맷 할 수있는 프레임 워크 코드로 전달되어 해석이 방법으로이

string query = "SELECT COUNT(ControlNumber) FROM Log " + 
       "WHERE DateChanged > ? AND [User] = ? AND " + 
       "Log.EndStatus in ('Needs Review', 'Check Search', 'Vision Delivery'," + 
       "'CA Review', '1TSI To Be Delivered');"; 

    OleDbCommand dbcommand = new OleDbCommand(query, conn); 
    dbcommand.Parameters.AddWithValue("@p1", curTime.AddHours(-1)); 
    dbcommand.Parameters.AddWithValue("@p2", User); 
    dbcommand.Connection.Open(); 
    dbcommand.CommandType = CommandType.Text; 
    OrdersPerHour = (int)dbcommand.ExecuteScalar(); 

부담과 같은 간단한 매개 변수화 된 쿼리를 사용합니다. 그런데이 또한 또한 SQL 인젝션

을 방지 할 단어 사용자가 액세스 SQL에서 예약 된 키워드입니다 때문에 대괄호

로 캡슐화 할 필요가
+1

C#에서는 @ 기호를 사용하여 연결을 필요로하지 않고 쿼리를 여러 줄로 확장 할 수 있습니다. – PeteGO

+0

@ 기호의 사용법에 대해 잘 알고 있지만,이 사용법은 줄의 형식에 따라 작성된 문자열에 상당한 양의 공백을 추가한다는 사실을 언급해야합니다. 이 문자열의 길이를 @ 기호와 함께 인쇄 해보십시오. 또한 이와 같은 상수 텍스트의 문자열 연결은 컴파일 타임에 값 비싼 문자열 연결을 사용하지 않고 정적으로 정의 된 고유 문자열을 빌드 할 때 해결됩니다 (IL 코드를 보면이를 확인합니다). – Steve

+0

"조건 식에서 데이터 형식이 일치하지 않습니다." ExecuteScalar()를 실행하면 오류가 발생합니다. – MaylorTaylor

1

가장 중요한 첫 번째 : 사용 매개 변수화 쿼리!

당신 "에서 OleDbCommand의 dbcommand"의의 CommandText를 확인하고 수동으로 같은 결과를 얻을 수 있는지 확인하기 위해 조회 : 문제에 대해서는

, 난 당신이 코드를 디버깅하는 것이 좋습니다.

또한 코드를 try catch 블록에 넣어야합니다. 그렇지 않으면 전혀 이해가되지 않습니다.

관련 문제