Несколько странная ошибка .NET, связанная с datetime - PullRequest
3 голосов
/ 20 декабря 2008

Я получаю эту ошибку на удаленном сервере, но тот же код выполняется локально. Пожалуйста, воздержитесь от того, чтобы говорить, что это отстой, или от того, что вы даете мне знать о динамическом 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? Независимо от того, является ли ошибка приведения типа / даты в строку, странно, что происходит сбой только на удаленном сервере, а не локально.

Строка не была распознана как действительный DateTime. Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и месте ее возникновения в коде.

Сведения об исключении: System.FormatException: строка не была распознана как допустимый 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: строка не была распознана как действительный DateTime.] System.DateTimeParse.Parse (String s, DateTimeFormatInfo dtfi, стили DateTimeStyles) +2291962 System.DateTime.Parse (String s, поставщик IFormatProvider) +26 System.Data.ConstNode..ctor (таблица DataTable, тип ValueType, константа объекта, логическое значение fParseQuotes) +485 System.Data.ExpressionParser.Parse () +830 System.Data.DataExpression..ctor (таблица DataTable, строковое выражение, тип Type) +124 System.Data.DataView.set_RowFilter (строковое значение) +161 controls_inspectionRequestChart.drpRange_SelectedIndexChanged (Отправитель объекта, EventArgs e) в xxxx controls_inspectionRequestChart.Page_Load (Отправитель объекта, EventArgs e) в xxxx 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 (логическое значение includeStagesBeforeAsyncPoint, логическое значение includeStagesAfterAsyncPoint) + 2041

Ответы [ 3 ]

6 голосов
/ 20 декабря 2008

Это может быть связано с разницей региональных настроек даты и времени между сервером и вашим ПК. В коде есть неявное преобразование между датой и временем (помните, что это встроенный sql (Edit: RowFilter синтаксис), параметр не устанавливается)

Попробуйте отформатировать строку

dv.RowFilter = "inspectionType='Buyer' AND postedDate >= #" & DateTime.Now.AddDays(-1).ToString("MMM dd yyyy hh.mm.ss") & "#"
2 голосов
/ 20 декабря 2008

Я думаю, что ответ 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

Это должно работать намного лучше, потому что позволяет базе данных обрабатывать фильтрацию строк и отправляет только необходимую информацию по соединению. Он также полностью устраняет проблему с преобразованием даты, позволяя базе данных справиться с этим за вас.

Конечно, реальные параметры запроса были бы еще лучше, но я понимаю, что вы пока не можете этого сделать, потому что вам нужно использовать эту пользовательскую оболочку базы данных, и это не имеет большого значения, поскольку единственным параметром является строго типизированное целое число. Кроме того, я не знаю, какие условия предоставляет обертка базы данных для возврата скалярного значения, а не набора данных. Должно быть что-то, но это означает, что вам нужно как минимум изменить это имя функции, чтобы этот код работал.

0 голосов
/ 20 декабря 2008

Что с # вокруг даты?

SQL понимает даты в кавычках при использовании представленных в тексте дат, то есть «01/01/1901» или «05/28/1978 21: 13: 00.000».

Набор данных / таблица, из которой вы выбираете, может иметь столбец postsDate в виде String, а не DateTime. Можете ли вы проверить тип столбца?

Проверьте региональные настройки на удаленном компьютере и посмотрите, соответствуют ли они вашим региональным настройкам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...