涉及datetime的一些奇怪的.NET错误

时间:2008-12-19 21:04:45

标签: asp.net vb.net datetime

我在远程服务器上收到此错误,但相同的代码在本地执行正常。请不要说它很糟糕,或者给我你动态sql的咆哮,我没有写它,只是想弄清楚为什么它会抛出异常。突出显示的错误是第56行。

Protected Sub drpDateRange_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles drpRange.SelectedIndexChanged
    Dim sql As String = "SELECT postedDate, inspectionType FROM tInspectionRequest WHERE source_lookupID = 'IRS_WEB' "
    If _franchiseID > 0 Then sql &= " and franchiseeID = " & _franchiseID.ToString
    Dim db As New Database
    Dim ds As DataSet = db.selectQuery(sql)
    Dim dv As New DataView(ds.Tables(0))
    dv.RowFilter = "inspectionType='Buyer' AND postedDate >= #" & DateTime.Now.AddDays(-1) & "#"
    lblB1.Text = dv.Count
End Sub

这是一个例外,似乎DateTime.Now.AddDays(-1)未能被强制转换为日期时间?无论它是一个转换问题/日期到字符串错误,奇怪的是它只在远程服务器上失败,而不是在本地。

字符串未被识别为有效的DateTime。 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中的起源位置的更多信息。

异常详细信息:System.FormatException:String未被识别为有效的DateTime。

来源错误:

Line 55: Dim dsInspectionHistory As DataSet = objDB.selectQuery(sqlInspectionHistory)

Line 56: Dim dvInspectionHistory As New DataView(dsInspectionHistory.Tables(0))

Line 57: dvInspectionHistory.RowFilter = "inspectionType='Buyer' AND postedDate >= #" & DateTime.Now.AddDays(-1).ToString & "#"

Line 58: lblB1.Text = dvInspectionHistory.Count

Line 59: dvInspectionHistory.RowFilter = "inspectionType='Seller' AND postedDate >= #" & DateTime.Now.AddDays(-1) & "#"

[FormatException:String未被识别为有效的DateTime。]    System.DateTimeParse.Parse(String s,DateTimeFormatInfo dtfi,DateTimeStyles样式)+2291962    System.DateTime.Parse(String s,IFormatProvider provider)+26    System.Data.ConstNode..ctor(DataTable表,ValueType类型,Object常量,Boolean fParseQuotes)+485    System.Data.ExpressionParser.Parse()+830    System.Data.DataExpression..ctor(DataTable表,String表达式,Type类型)+124    System.Data.DataView.set_RowFilter(String value)+161    xxxx中的controls_inspectionRequestChart.drpRange_SelectedIndexChanged(Object sender,EventArgs e)    xxxx中的controls_inspectionRequestChart.Page_Load(Object sender,EventArgs e)    System.Web.UI.Control.OnPreRender(EventArgs e)+2117788    System.Web.UI.Control.PreRenderRecursiveInternal()+86    System.Web.UI.Control.PreRenderRecursiveInternal()+170    System.Web.UI.Control.PreRenderRecursiveInternal()+170    System.Web.UI.Control.PreRenderRecursiveInternal()+170    System.Web.UI.Control.PreRenderRecursiveInternal()+170    System.Web.UI.Control.PreRenderRecursiveInternal()+170    System.Web.UI.Control.PreRenderRecursiveInternal()+170    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)+2041

3 个答案:

答案 0 :(得分:6)

这可能是由于服务器和开发PC之间的区域日期时间设置差异造成的。代码中的datetime和string之间存在隐式转换(记住它是内联sql(编辑:RowFilter语法),你没有设置参数)。

尝试格式化字符串

dv.RowFilter = "inspectionType='Buyer' AND postedDate >= #" & DateTime.Now.AddDays(-1).ToString("MMM dd yyyy hh.mm.ss") & "#"

答案 1 :(得分:2)

我认为ChrisE的答案可能会解决您的问题,但是当您修复它时,为什么不实际修复它。

Protected Sub drpDateRange_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles drpRange.SelectedIndexChanged
    Dim sql As String
    sql = "DECLARE @Yesterday DateTime;Set @Yesterday= getdate()-1;" & _
      " SELECT COUNT(*) AS CNT" & _
      " FROM tInspectionRequest" & _
      " WHERE source_lookupID = 'IRS_WEB' AND inspectionType='Buyer'" & _
          " AND (@FranchiseID <= 0 OR @FranchiseID = franchiseID)" & _
          " AND postedDate >= @Yesterday;"
     lblB1.Text = New Database().selectQuery(sql.Replace("@FranchiseID", _franchiseID.ToString()))
End Sub

这应该更好地执行更多,因为它允许数据库处理过滤行,并且只在连接上发送必要的信息。通过让数据库为您处理这个问题,它还完全支持您的日期转换问题。

当然真正的查询参数会更好,但我知道你不能这样做,因为你必须使用那个自定义数据库包装器,这里没什么大不了的,因为唯一的参数是一个强类型的整数。另外,我不知道数据库包装器返回标量值而不是数据集的条件是什么。应该有一些东西,但这意味着您至少需要更改该函数名称才能使此代码生效。

答案 2 :(得分:0)

围绕约会的#是什么?

SQL在使用文本表示日期时理解引用日期,即'01 / 01/1901'或'05 / 28/1978 21:13:00.000'。

您选择的数据集/表可能将publishedDate列作为String而不是DateTime。你能检查一下列类型吗?

检查远程计算机上的区域设置,看它们是否与您的区域设置匹配。