文字列から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
、ここで、私が得るエラーです 文字列
から日時を変換するとき、変換に失敗しました私は、日時フィールドが関数に文字列として渡されることを理解しますが、どのような選択肢私は持っていますか?
解決
あなたは管理のスタジオで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