質問

私のカスタム関数に渡された文字列は、次のされます:

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

、ここで、私が得るエラーです 文字列

から日時を変換するとき、変換に失敗しました

私は、日時フィールドが関数に文字列として渡されることを理解しますが、どのような選択肢私は持っていますか?

役に立ちましたか?

解決

あなたは管理のスタジオで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

オフトピック:SQLでBETWEENキーワードは>= AND <=条件を表現するだけできちんとした方法である。

これは、SQLインジェクションの脆弱性の匂い。その日は、ユーザー(でも間接的に)から来万が一ませんでしたそれをやりましたか?この1つは安全であっても、優れたクエリパラメータを考慮していない「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日はあいまいである - 11月の7月か7日の第11回です。

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'

あるいは、href="http://sql.dzone.com/news/custom-date-formatting-sql-ser" rel="nofollow noreferrer">フォーマットコード、またはカスタム1 に、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)

あなたは日時に文字を変換するためにCONVERTコマンドを使用することができます。

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