1

カスタム関数に渡される文字列は次のとおりです。

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

ここに私が得るエラーがあります.文字列から日時を変換するときに変換に失敗しました

日時フィールドが文字列として関数に渡されることは理解していますが、どのようなオプションがありますか?

4

5 に答える 5

2

パラメータ化されたクエリの使用を検討しましたか? 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

トピック外: BETWEENSQL のキーワードは、>= AND <=条件を表現するための適切な方法です。

于 2009-07-11T21:20:38.653 に答える
2

これは、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-07-11T21:25:51.293 に答える
1

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'

または、 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)
于 2009-07-11T20:30:16.633 に答える
1

管理スタジオでSQLを実行して、何が起こるか見てみましたか?

于 2009-07-11T20:37:21.157 に答える
0

CONVERT コマンドを使用して、char を日時に変換できます。

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 コードで例外が発生した場合、接続は閉じられません。これを修正するために、Using コードを少し追加することをお勧めします。

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
于 2009-07-11T20:34:11.053 に答える