2009-07-11 104 views
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 

,这里是错误我得到的, 转换从字符串转换日期时间失败时

我知道datetime字段作为字符串传递给函数,但我有什么选择?

回答

1

您是否试过在管理工作室中运行sql并查看会发生什么?

1

11/7/2009含糊不清 - 是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' 

或者,使用正确的转换与正确format code,或者custom one,如建议通过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) 
+0

月11日...今天 – OrElse 2009-07-11 20:32:30

+0

7月11日的! dd/MM/yyyy – OrElse 2009-07-11 20:50:04

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 
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 

题外话:在SQL中BETWEEN关键字只是一种巧妙的方法表示>= AND <=条件。

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