2012-09-27 2 views
1

양식의 데이터를 사용하여 SQL Server 2008에 데이터를 입력하려고합니다. 이 아래에있는 내 양식에 대한 코드입니다오류 : varchar 데이터 형식을 datetime 데이터 형식으로 변환하면 범위를 벗어나는 값이 발생합니다.

The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
The statement has been terminated

: 나는 내가 다음과 같은 오류를 받고 있어요 양식을 실행하려고하지만 때 DB에이 데이터를 양식에서 날짜를 선택하기에 DateTimePicker를 사용하여 입력하고 : 나는 방법 저장할 위치를 여기

private void btnAddBooking_Click(object sender, EventArgs e) 
{ 
      DateTime requested = dtpRequested.Value; 
      DateTime pickup = dtpPickup.Value; 
      DateTime estDropoff = dtpEstimatedDrop.Value; 

      SAF.AddNewBooking(requested, pickup, estDropoff, selectedStatus.StatusId, selectedRate.RateId); 
      dtpRequested.CustomFormat = " "; 
      dtpPickup.CustomFormat = " "; 
      dtpEstimatedDrop.CustomFormat = " "; 

      cbStatus.SelectedIndex = 0; 
      cbRateOfPayment.SelectedIndex = 0; 

      MessageBox.Show("Booking Created"); 
      tabControl2.SelectTab(2); 
} 

는 외관에 코드입니다 :

public void AddNewBooking(DateTime requestedD, DateTime pickupD, DateTime estDropOff, int statusId, int rateId) 
{ 
      dao.AddNewBooking(requestedD, pickupD, estDropOff, statusId, rateId); 
}//end CreateBooking 

을이 내 DAO에서 INSERT 문 코드 :

sql = "INSERT INTO [Transaction] (TransactionId, RequestedDateOfPickup, ActualDateOfPickup, EstimatedDropOffDate, StatusId, RateId)"; 
sql += String.Format("VALUES('{0}', '{1}', '{2}', '{3}', {4}, {5})", transactionId, requestedD, pickupD, estDropOff, statusId, rateId); 

cn = new SqlConnection(Properties.Settings.Default.UKRENTALSConnectionString); 
cmd = new SqlCommand(sql, cn); 

cn.Open(); 
cmd.ExecuteNonQuery(); 
+4

[매개 변수] (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx)를 사용하면 SQL 주입을 방지 할 수 있으며 오류도 해결할 수 있습니다. – Habib

+0

데이터 유형을 버리고 모든 것을 문자열로 처리하기 전까지는 모든 것이 잘 돌아갔다. @Habib이 언급했듯이 매개 변수를 사용해야합니다. 또한, 'Transaction'은 테이블에 대한 실제 이름이 아닙니다. –

답변

2

아마이가 실행되고 있음을 기계의 지역 설정과 함께 할 수있는 뭔가, 궁극적으로의 라인을 따라 당신의 삽입 성명있는 무언가로 전달되는 날짜 형식 :

27/09/2012 4:17:42 PM 

(이 글을 쓰면서 호주에있는 현재 날짜 임).

SQL Server는 사용중인 날짜 형식으로 캐스팅하려고 시도 할 수 있습니다. 예를 들어 첫 번째 매개 변수는 월이지만 27은 12보다 큰 것으로 생각할 수 없습니다. YYYY-MM-DD 형식으로 날짜를 포맷

시도 :

2012-09-27 

또는 더 나은 아직, 파라미터를 사용하는 대신, 당신은 거기에 SQL 주입 취약점을 가지고있다.

+0

날짜가 데이터베이스와 동일한 형식으로 전송됩니다. –

+0

물론, 요청한 데이터를 보내면 어떻게됩니까? "(예 :"yyyy -MM-dd ")? 오류는 SQL Server에서 문자열을 날짜로 변환하려고했지만 결과 날짜가 범위를 벗어났습니다. 나는 이것이 문제를 해결할 것이라고 믿는다. –

+0

확인했는데 ... 하나의 열이이 오류를 알려주는 것처럼 보입니다 ... 나머지 날짜 열은 데이터를 수신합니다. –

관련 문제