문제

내 사용자 지정 기능으로 전달 된 문자열은 다음과 같습니다.

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top