传递给我的自定义功能的字符串如下:

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

和以下是错误我得到的, 转换从字符串

转换的日期时间时失败

据我所知,日期时间字段作为字符串传递到函数,但做什么选择我呢?

有帮助吗?

解决方案

您是否尝试过在运行Management 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

题外话:在SQL中BETWEEN关键字只是表达>= 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届

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)

可以使用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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top