【问题标题】:Going to dates in the past in calendar program在日历程序中转到过去的日期
【发布时间】:2016-01-19 04:13:25
【问题描述】:

我正在开发一个程序,其中 SQL DB 中给定日期的所有事件都会填充日历。我最近从 MYSQL 切换到 MSSQL 2012,现在收到错误 "Conversion failed when converting date and/ or time from character string."

这是构成日期的代码

   '// Set Start and End Date
    If numericMonth < 10 Then
        doubleMonth = "0" & numericMonth 'If Month was September  doubleMonth = 09 
        startDate = numericYear & "-" & doubleMonth & "-01" ' If date was June 1 2015 startdate would = 2015-06-01
        Calendar1.Refresh()
    Else
        startDate = numericYear & "-" & numericMonth & "-01"
        doubleMonth = numericMonth
    End If
    Dim endDate As String
    If numericMonth < 10 Then
        endDate = numericYear & "-0" & numericMonth & "-31"
    Else
        endDate = numericYear & "-" & numericMonth & "-31" ' If date was June 30 2015 enddate would = 2015-06-31
    End If



    If bypassMode = "0" Then




        count = 0
        dbQuery = "SELECT * FROM SOEVENTS WHERE DATE BETWEEN '" & startDate & "' AND '" & endDate & "' ORDER BY date ASC"

        If SQL.HasConnection = True Then
            SQL.RunQuery(dbQuery)
        End If

最终结果的格式为 yyyy-mm-dd。未来的所有月份都有效,但过去的每 3 个月似乎都无效。

【问题讨论】:

  • 将字符串解析为datetime在你将它传递给数据库。因此使用Date.Parse 或Date.TryParse。然后use sql-parameters提供这个参数。这样你就可以避免本地化和转换问题,更重要的是,sql-injection。所以永远不要使用字符串连接来构建你的 sql 查询。
  • 使用日期查询数据库。您自己将所有内容都转换为字符串时非常容易出错和复杂。 Dim startDate As New DateTime(year, month, day)

标签: mysql sql-server vb.net


【解决方案1】:

尽管代码的效率和安全性很高,但明显的问题是 12 个月中有 5 个月没有第 31 天,在这些情况下,您试图分配无效的日期。当您使用它的方法时,VB 知道如何正确计算日历单位(例如月份),但是从字符串中分配无效日期会产生错误。试试这个:

Dim endDate As DateTime = startDate.AddMonths(1).AddDays(-1)

【讨论】:

  • 我确实有代码可以检查所选月份的日期。这就是我不明白这种方法适用于 MySQL,但现在我正在使用 MSSQL 并且我得到错误。
  • 您发布的代码格式 endDate 始终以“-31”结尾,并将其连接到 dbquery 而不对其执行任何其他功能。检查该月最后一天的代码在哪里?这里怎么称呼?由于处理无效的日期格式在 SQL 编译器之间很可能有所不同(2015-02-31 在 MySQL 中很可能有效,但在 MSSQL 中无效),您为什么不测试一下以确保呢?如果您反对使用DateTime 变量,就像我的回答一样,您可以尝试将“-31”更改为“-28”。结果会告诉您这是否是您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
相关资源
最近更新 更多