2011-01-04 7 views
0

SQL Server 2005에서 데이터를 읽은 다음 TableAdapter (사용자 DataReader도 시도 함)에서 채우려고했지만이 예외가 계속 발생합니다. 문제는 일부 시스템에서이 오류가 발생합니다. 즉, 시스템에서 peacfully 내 응용 프로그램을 실행하지만 다른 시스템에서는이 예외가 발생합니다.문자열에서 datetime을 변환 할 때 변환하지 못했습니다.

코드입니다 :

public DataSetRef GetReportPumpControl(PumpInfo pump, DateTime start, DateTime end) 
    { 
     if (!OpenConnection()) 
      return null; 

     m_Command.CommandText = "SELECT ref_dig_pumpcontrol, ref_energy, ref_datetime FROM [molisoftSchema].[Refresh] WHERE ref_pump_id = " + pump.ID + " AND ref_datetime BETWEEN '" + start + "' AND '" + end + "' ORDER BY ref_datetime ASC"; 

     SqlDataAdapter adapter = new SqlDataAdapter(m_Command); 
     DataSetRef ds = new DataSetRef(); 
     adapter.Fill(ds, "RefreshPC"); 

     return ds; 

     /*m_Reader = m_Command.ExecuteReader(); 

     LinkedList<PumpControlInfo> returnValue = new LinkedList<PumpControlInfo>(); 
     while (m_Reader.Read()) 
     { 
      PumpControlInfo tempControl = new PumpControlInfo(); 
      tempControl.DateTime = (DateTime)m_Reader["ref_datetime"]; 
      tempControl.Energy = (double)m_Reader["ref_energy"]; 
      tempControl.PumpControl = (bool)m_Reader["ref_dig_pumpcontrol"]; 

      returnValue.AddLast(tempControl); 
     } 
     m_Reader.Close(); 
     return returnValue.ToArray<PumpControlInfo>();*/ 
    } 

이 문제 좀 도와주십시오. 미리 감사드립니다.

답변

1

문자열 연결 (및 암시 적 변환)을 사용하는 대신 매개 변수로 쿼리 값을 설정해야합니다. 보십시오 : 제외

m_Command.CommandText = "SELECT ref_dig_pumpcontrol, ref_energy, ref_datetime FROM [molisoftSchema].[Refresh] WHERE ref_pump_id = @id AND ref_datetime BETWEEN @start AND @end ORDER BY ref_datetime ASC"; 
m_Command.Parameters.AddWithValue("@id", pump.ID); 
m_Command.Parameters.AddWithValue("@start", start); 
m_Command.Parameters.AddWithValue("@end", end); 

을 전반적으로 좋은 연습이되는 것을이 더 암시 인라인 문자열 변환보다 이런 종류의 위해 설계 매개 변수 자리에 변환 속성을 사용합니다.

6

죽이기 2 새 1 돌과 SQL의 파라미터 (SQL 주입 공격으로부터 당신을 보호합니다) : 문제는 .NET 시작 및 종료 날짜 시간 값을 문자열로 직렬화되고 있었기 때문에

m_Command.CommandText = "SELECT ref_dig_pumpcontrol, ref_energy, ref_datetime FROM [molisoftSchema].[Refresh] WHERE ref_pump_id = @pumpid AND ref_datetime BETWEEN @StartDate AND @EndDate ORDER BY ref_datetime ASC"; 

m_Command.Parameters.AddWithValue("@pumpid", pump.ID); 
m_Command.Parameters.AddWithValue("@StartDate", start); 
m_Command.Parameters.AddWithValue("@EndDate", end); 

"하드 코드"를 생성중인 SQL에 추가하십시오. 그러나이 문자열 표현을 SQL의 유효한 datetime으로 다시 변환 할 수 없습니다 (yyyy-MM-ddTHH : mm : ss와 같은 SAFE 날짜 형식을 사용해야하므로 SQL 문에 추가하기 전에 해당 DateTimes를 명시 적으로 형식화해야합니다) . 그러나 매개 변수화는 이런 종류의 문제를 해결하는 훨씬 더 나은 솔루션입니다.

+0

미리 감사드립니다. – Moh

관련 문제