2013-03-14 3 views
0

내 C#의 윈폼 도구 DateTime을 사용하고, 나는이 줄을 사용하여 SQL 데이터베이스에 날짜를 저장 해요 :데이터베이스에서 잘못된 날짜로 읽은 날짜가 있습니까?

iDisc.acquirementDate.ToString("yyyy-MM-dd")

SQL 데이터베이스 필드 DATE 유형 인을 때이 날짜가 내가 값을하려는 경우 2013-03-14

, 나는이 줄을 사용하십시오 : 그러나

DateTime acquirementDate = DateTime.ParseExact(iDiscRow[TableNames.Discs.acquirementDate].ToString(), "yyyy-MM-dd", CultureInfo.InvariantCulture); 

을하는 FO 이와 같은, 그것의 잘못 보관, 저장 구문 분석중인 문자열이 유효한 DateTime 불만 문자열이 아니기 때문에 rmatException이 위의 행에서 발생합니다.

이 해석되는 값이며이 : 3/14/2013 12:00:00 AM

데이터베이스에 그 2013-03-14로 저장했을 때, 왜 값이 3/14/2013 12:00:00 AM으로 읽어 이해하지 않는 무엇?

데이터베이스에서 데이터를 검색하는 데 SqlDataReader을 사용하고 있습니다. 여기에 코드를 게시 할 수 있지만, 필자는 그 코드를 매우 기본적인 것으로 생각하지 않습니다.

+0

귀하의 날짜가 데이터베이스에 입력 한 날짜의 수 있습니다 샘플 호출입니다,하지만 당신은 날짜 시간으로 검색하는 것입니다. 나는 그것이 당신의 문제의 뿌리라는 것을 모른다. 그러나 당신은 그것을보고 싶을지도 모른다. – Melanie

+0

아니, 그게 그 이유라고 생각하지 않아. 코드를 디버깅하고'iDiscRow' (데이터베이스에서 가져온 데이터베이스 레코드의 값을 저장하는 DataTable 행)에 저장된 값을 보면,'2014 년 3 월 14 일 12:00:00 AM '값이 표시됩니다. 따라서 값은 확실히이 형식의 데이터베이스에서 가져옵니다. – Ahmad

+0

이것은 단순히 'DateTime' 개체의 내부 형식입니다. 이것을 원하는 형식의 문자열로 변환하려면, 저장할 때처럼'.ToString ("yyyy-MM-dd")'를 사용하십시오. 또한, SQL 데이터 타입이'DATE '이기 때문에 그것을 문자열로 읽어 들일 필요가 없습니다. 당신은 그것을'DateTime' 객체로 곧바로 읽을 수 있어야합니다. – JosephHirn

답변

1

iDiscRow[TableNames.Discs.acquirementDate]이 이미 DateTime 인 것으로 보입니다. 이 경우에는 그냥 캐스팅해야합니다. 당신이 3/14/2013 12:00:00 AM을 얻고있는 이유

DateTime acquirementDate = (DateTime)iDiscRow[TableNames.Discs.acquirementDate]; 

그리고 이유는 DateTime.ToString()stringDateTime을 trasnform하기 위해 현재 스레드 문화를 사용한다는 것입니다. WinForm 응용 프로그램이기 때문에 DateTime의 Windows 시스템 형식이라고 생각합니다.

+0

'DateTime.ToString'을했을 때 어떤 라인을 언급하고 있습니까?필자가 이해할 수없는 것은 SQL 내에서이 작업을 수행한다고 가정합니다. 'AcquirementDate From Discs'를 선택하면 'YYYY-MM-DD'형식의 값이 표시됩니다. 그러나 C# (일부 일반 DB 함수 사용)을 통해 * 동일한 * 쿼리를 시도하면 선택 결과를 저장하는 DataTable은 AcquirementDate 열에 대해 'mm/dd/yyyy hh : mm : ss'형식을 사용합니다. 이 시점까지 DateTime에 대한 * no * 참조가 만들어졌습니다 (이 테스트 케이스에서). 그렇다면 C#이 자동으로 날짜를 다른 형식으로 변경하는 이유는 무엇입니까? – Ahmad

+0

SQL Server 날짜 열 값은 C#의 DateTime 개체로 직접 변환됩니다. 'mm/dd/yyyy hh : mm : ss'는 DateTime 값 (바이너리)의 사람이 읽을 수있는 문자열 표현입니다. 'mm/dd/yyyy ...'는 Windows의 "국가 및 언어"설정에서 설정됩니다. – Nenad

1

행이 객체로 검색됩니다. ToString() 메서드는이를 형식화합니다. ToString() 메서드에 사용할 형식을 전달해야합니다.

+1

주요 문제는 그가 이미 DateTime 인 객체를 파싱하고 있다는 것입니다. 그는 단지 그것을 던져야합니다. – Nenad

+0

그래, 나는 동의한다, 당신은 이미 DateTime 객체를 가지고 있고, 그것을 포맷하고 파싱 할 필요가 없다. –

0

이 답변은 데이터베이스 값이 null 일 수있는 경우에만 관련이 있습니다. 그것은 종종 내 자신의 상황이므로 클래스 라이브러리의 도우미 클래스에이 함수를 작성했습니다. 여기

public DateTime? SetDateTimeValue(DataTable dataTableIn 
     , int rowNumber, string fieldName) 
    { 
     DateTime? returnValue = new DateTime?(); 
     DateTime tempValue = new DateTime(); 
     try 
     { 
     string fieldValueAsString = dataTableIn.Rows[rowNumber][fieldName].ToString(); 
     result = DateTime.TryParse(fieldValueAsString, out tempValue); 
     if (result) 
       returnValue = tempValue; 
      } 
     catch 
     { 
      returnValue = null; 
     } 
     return returnValue; 
    } 

DataTable data = dataAccess.GetEmergencyVisitDataFromClinicalApplicationSupport(VisitID); 

     if (data.Rows.Count == 1) 
     { 
      ValueSetter setterOfValues = new ValueSetter(); 
      skip a bunch of lines. 
      AdmitDecisionDateTime = 
      setterOfValues.SetDateTimeValue(data, 0, "admit_decision_datetime");