문자열에서 dateTime을 변환 할 때 변환이 실패했습니다
-
12-09-2019 - |
문제
내 사용자 지정 기능으로 전달 된 문자열은 다음과 같습니다.
SELECT key FROM ubis WHERE MemberID = '144'
AND To >='11/7/2009 9:11:23 pm'
AND From <= '11/7/2009 9:11:23 pm'
Public Shared Function GetDataTable(ByVal CmdText As String) As DataTable
Dim myConn As New SqlConnection(ConfigurationManager.ConnectionStrings("Conn").ConnectionString)
Dim myCmd As New SqlCommand(CmdText, myConn)
myConn.Open()
Dim myReader As SqlDataReader = myCmd.ExecuteReader()
Dim myTable As New DataTable()
myTable.Load(myReader)
myConn.Close()
Return (myTable)
End Function
그리고 여기에 내가 얻는 오류가 있습니다. 캐릭터 문자열에서 dateTime을 변환 할 때 변환이 실패했습니다.
DateTime 필드가 함수로 문자열로 전달된다는 것을 이해하지만 어떤 옵션이 있습니까?
해결책
Managment Studio에서 SQL을 실행하고 어떻게되는지 보셨습니까?
다른 팁
매개 변수화 쿼리 사용을 고려해 보셨습니까? 이것은 당신의 문제를 해결하고 WHERE
조건은 사용자 입력에서 가져옵니다.
예제 (vb.net) :
Dim myCmd As New SqlCommand(CmdText, myConn)
myCmd.Parameters.AddWithValue("MemberID", 144)
myCmd.Parameters.AddWithValue("Timestamp", DateTime.Now)
이 쿼리 텍스트 (SQL)와 함께 사용됩니다.
SELECT key FROM ubis WHERE MemberID = @MemberID
AND @Timestamp BETWEEN From AND To
주제 : BETWEEN
SQL의 키워드는 >= AND <=
정황.
이것은 SQL 주입 취약점의 냄새가납니다. 그 날짜는 우연히 사용자에게서 나오지 않았다 (간접적으로)? 이 제품이 안전하더라도 좋은 쿼리 매개 변수를 설명하지 않는 'getDatatable ()'와 같은 일반적인 기능은 거의 항상 실수입니다.
당신은 다음과 같은 것을 원합니다 :
Public Shared Function GetMemberKeys(ByVal MemberID As Integer, ByVal KeyDate As DateTime) As DataTable
Static sql As String= _
"SELECT key" _
+ " FROM ubis" _
+ " WHERE MemberID= @MemberID AND @KeyDate BETWEEN [FROM] AND [TO]"
Dim dt As New DataTable()
Using cn As New SqlConnection(ConfigurationManager.ConnectionStrings("Conn").ConnectionString), _
cmd As New SqlCommand(sql, cn)
cmd.Parameters.Add("@MemberID", SqlDbType.Int).Value = MemberID
cmd.Parameters.Add("@KeyDate", SqlDbType.DateTime).Value = KeyDate
cn.Open()
Using rdr As SqlDataReader = cmd.ExecuteReader()
dt.Load(rdr)
End Using
End Using
Return dt
End Function
2009 년 11 월 7 일은 모호합니다 - 7 월 11 일 또는 11 월 7 일입니까?
SQL은 알 수있는 방법이 없으며 설정 한 기본값에 따라 다릅니다. 날짜를 모호하지 않은 형식으로 전달하는 것이 좋습니다.
SELECT key FROM ubis WHERE MemberID = '144'
AND To >='11 July 2009 9:11:23 pm'
AND From <= '11 July 2009 9:11:23 pm'
또는 올바른 전환을 사용하십시오 형식 코드,, a 맞춤형, Zyphrax가 제안한대로 :
SELECT key FROM ubis WHERE MemberID = '144'
AND To >= CONVERT(datetime, '11/7/2009 9:11:23 pm', 105)
AND From <= CONVERT(datetime, '11/7/2009 9:11:23 pm', 105)
변환 명령을 사용하여 char를 dateTime으로 변환 할 수 있습니다.
SELECT key FROM ubis WHERE MemberID = '144'
AND To >= CONVERT(datetime, '11/7/2009 9:11:23 pm', 105)
AND From <= CONVERT(datetime, '11/7/2009 9:11:23 pm', 105)
105에 대해 잘 모르겠습니다. 올바른 형식 코드를 위해 Google을 사용해야 할 수도 있습니다.
또한 SQL 코드에서 예외가 발생하면 연결이 닫히지 않습니다. 코드를 사용 하여이 문제를 해결하기 위해 약간의 코드를 추가 할 수 있습니다.
Public Shared Function GetDataTable(ByVal CmdText As String) As DataTable
Using myConn As New SqlConnection(ConfigurationManager.ConnectionStrings("Conn").ConnectionString)
Using myCmd As New SqlCommand(CmdTxt, myConn)
conn.Open()
Using myReader As SqlDataReader = myCmd.ExecuteReader()
Dim myTable As New DataTable()
myTable.Load(myReader)
myConn.Close()
Return (myTable)
End Using
End Using
End Function