【问题标题】:vb.net SQL date to time conversion issuevb.net SQL日期到时间转换问题
【发布时间】:2011-07-23 21:54:01
【问题描述】:

错误是:从字符串转换日期和/或时间时转换失败。

基本上,我试图做到这一点,以便当有人单击列表框中的位置时,它会将 Stats 表中的正确字段增加 1,以表示他们单击了该位置。我一直在尝试解决这个问题一段时间,但无处可去。我的日期是日期格式,我的 Stats 表中的 Date 字段也是如此。我的代码如下所示。

    Dim Current As String
    Dim Check As String
    Dim objCmd2 As Object
    Dim iCount As Integer
    Dim tDate As Date

    Current = LocBox.SelectedItem

    Check = LocList.FindString(Current)

    If Check > -1 Then
        MsgBox("You have already selected this place to visit")
    Else
        LocList.Items.Add(Current)
        ObjDataReader.Close()
        tDate = Date.Today
        MessageBox.Show(tDate)
        tDate = tDate.ToString()
        objCmd2 = New SqlCommand("SELECT " & Replace(Current, " ", "_") & " FROM Stats WHERE Date = '" & tDate & "'", objConn)
        ObjDataReader = objCmd2.ExecuteReader
        If ObjDataReader.HasRows Then
            ObjDataReader.Read()
            If ObjDataReader(0) Is DBNull.Value Then
                iCount = 0
            Else
                iCount = ObjDataReader(0)
            End If
        Else
            iCount = 0
        End If
        objCmd = New SqlCommand("INSERT INTO Stats(Date," & Replace(Current, " ", "_") & ") Values('" & tDate.Date & "'," & iCount & " )", objConn)
        ObjDataReader.Close()
        objCmd.ExecuteNonQuery()
        objConn.Close()

提前致谢。

问题出现在我认为的第二条 SQL 语句中。我不明白为什么在日期字段中添加日期会成为问题,我尝试将其添加为无效的字符串。感谢到目前为止的所有答案。

【问题讨论】:

  • 使用带有正确数据类型参数的参数化查询。这更安全(SQL 注入),应该可以解决您的问题。
  • Sql Server中datetime列的格式是什么?它实际上是一个约会时间吗?还是类似于varchar?在处理日期和时间时,您不应该使用字符串。使用日期时间。

标签: sql sql-server vb.net date


【解决方案1】:

正如 Martin 指出的那样,这可能是最好的选择:

int colnum = ConvertColumnNameToNumber(Current)
objCmd2 = New SqlCommand("SELECT "+colnum.ToString()+" FROM Stats WHERE [Date] = @inDate", objConn)
objCmd2.Parameters.Add("@inDate",SqlDbType.DateTime).value = tDate

未经测试或编译可能有错别字。

请注意上面对 colnum 的使用。因为您不能对列名使用参数,所以必须使用列号。如果你的代码返回一个整数作为返回值,你可以防止注入(它只能是一个数字)。

【讨论】:

  • 为什么会有帮助?如果 OP 收到消息 Conversion failed when converting date and/or time from character string. 添加显式转换仍然会给他们同样的错误。该字符串显然不是 SQL Server 可接受的格式。
  • 我相信 cast 在失败时会返回 null ——所以它不会抛出错误。
  • @Hogan - 那时你完全错误地相信 - 即使它确实(它没有)不会更正确的做法是修复字符串格式以便 SQL Server 理解它? (虽然这里唯一真正正确的答案是使用参数)
  • @Martin -- 很好 -- 那么请告诉我一个可以处理非法日期格式并且不会失败的 SQL 语句。
  • @Coolmurr, @Martin -- 我更改它以显示“不”参数化列名的安全方法。您不能使用从浏览器返回的字符串,但如果您有一个仅返回整数的辅助函数,那么您是安全的。
【解决方案2】:

我猜问题出在这里:MessageBox.Show(tDate)

您需要使用 tDate.ToString 或您想要的任何其他方法将日期转换为字符串。

您是否遇到编译错误?我总是使用 Option Strict On 进行编码,而你的代码肯定会在你没有转换变量的地方出现错误。

【讨论】:

    【解决方案3】:

    我可能偏离了基础,但是您将 tDate 作为 Date 变量类型,然后您尝试将其发送为字符串,您可以在 SqlCommand 行中使用 tDate.ToString() 而不是先转换它。

    【讨论】:

      【解决方案4】:

      尝试从 tdate 周围删除撇号,使其...

      objCmd2 = New SqlCommand("SELECT " & Replace(Current, " ", "_") & " FROM Stats WHERE Date = " & tDate, objConn) 
      

      objCmd = New SqlCommand("INSERT INTO Stats(Date," & Replace(Current, " ", "_") & ") Values(" & tDate.Date & "," & iCount & " )", objConn) 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多