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 命令将字符转换为日期时间。

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,你可能需要谷歌才能找到正确的格式代码。

此外,如果您的 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
于 2009-07-11T20:34:11.053 回答