当前位置: 首页 > 知识库问答 >
问题:

ASP Classic和SQL日期超出范围错误

申屠瀚海
2023-03-14

我正在移动一个ASP经典应用程序到一个新的服务器。我没有开发的应用程序和我没有经验与ASP希望有人能指导我。

Microsoft OLE DB Provider for ODBC Drivers error '80040e07' 

[Microsoft][ODBC SQL Server Driver][SQL Server]The conversion of a varchar data type to a datetime data type resulted in an out-of-range value. 

/clientname/Admin/EntregasProcess.asp, line 49 

我读到可能是日期格式,所以我把它改成YYYY-MM-DD。

现在它正显示出这一点:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07' 

[Microsoft][ODBC SQL Server Driver][SQL Server]The conversion of a varchar data type to a datetime data type resulted in an out-of-range value. 

/clientname/Admin/EntregasProcess.asp, line 62

数据库上的日期格式如下所示:

2006-07-31 00:00:00.000 

这是asp文件的代码:

<%@ Language=VBScript %>
<!--#include file="StrConn.asp"-->
<%

if Session("Role") <> "AD" Then 'AD=Administrador, CG = Consulta Gral.
Response.Redirect "../home.asp"
end if

%>

<%

Dim month_number, year_number, day_number, tituloEntrega, Estatus, idCuestionario, date_number

month_number = Request.Form("month_number")
year_number = Request.Form("year_number")
day_number = Request.Form("day_number")
tituloEntrega = trim(Request.Form("tituloEntrega"))
idCuestionario = Request.Form("idCuestionario")
Estatus = Request.Form("Estatus")
idEntrega = Request.Form("idEntrega")
<!--BITACORA::ESC::Oscar Salgado 20090729-->
bitacora = Request.Form("bitacora")
page = Request.Form("page")
<!--=====================================-->


date_number = dateSerial(year_number,month_number+1,day_number)

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open strConnPortal

<!--BITACORA::ESC::Oscar Salgado 20090729-->
SQL="Delete from dbo.tbBitacoraShow where idCuestionario = " & idCuestionario
conn.execute(SQL)
if bitacora = "1" Then
    SQL="Insert into dbo.tbBitacoraShow(idCuestionario) values(" & idCuestionario & ")"
end if
conn.execute(SQL)
<!--=====================================-->

Select Case Request.Form("btnGo")

    Case "Agregar"
    if trim(tituloentrega) <> "" Then
        SQL = "Insert into tbEntregas(TituloEntrega,Date,Estatus,IDCuestionario) values('" & _
            tituloEntrega & "','" & date_number & _
            "'," & estatus & ",'" & idCuestionario & "')"
        conn.Execute sql
    end if


    'Response.Write SQL
    'Response.End

    Case "Actualizar"

    SQL = "update tbEntregas Set TituloEntrega = '" & tituloEntrega & _
        "',Date='" & date_number & " ',Estatus=" & estatus & _
        ",IdCuestionario='" & idCuestionario & "' Where idEntrega = " & idEntrega

    conn.Execute sql

    'Response.Write SQL
    'Response.End

End Select


Response.Redirect "Entregas.asp?idEntrega="&idEntrega&"&page="&page

%>

共有1个答案

柯清野
2023-03-14

好的,这是一个常见的问题,当您的查询没有正确的参数化。我认为这是一种不好的做法。

当开发人员将日期格式硬编码到应用程序中时,就会出现此问题。它受到一个或多个相关因素的影响:

  • 更改IIS/Web服务器中的区域/语言设置
  • 数据库用户中语言设置的更改

日期必须为ODBC cannonical格式(“yyyy-mm-dd hh:mm:ss”)以避免任何问题。这是通用格式,您可以避免我前面提到的任何因素。

我给你三种可能的解决方案:

正确的方法是在ASP中使用“.createParameter()”方法对“adodb.command”对象的查询进行正确的参数化,并将其附加到命令中。问题是您需要添加大量的附加代码来实现这一点。

示例代码

'-------------------------------------------------------------------'
Set oCmd = Server.CreateObject("ADODB.Command")
oCmd.CommandText = sSQL
set oCmd.ActiveConnection= oConn
Set oPar = oCmd.CreateParameter("initial_date",7,1,,dDate) 'Date
oCmd.Parameters.Append(oPar)
'-------------------------------------------------------------------'

实际的方法是将硬编码格式改为cannonical格式,以避免当前和未来可能出现的问题。

快速修复方法是更改Web服务器中的区域设置或数据库服务器中的语言设置,以匹配过去的实现。

如何做到这一点:

首先,您需要知道开发人员在应用程序中使用的是哪种格式:例如,在墨西哥,格式是DD/MM/YYYY,通常服务器是英文的(MM/DD/YYYY)

Web服务器-区域设置

访问应用程序数据库的用户

将默认语言设置为应用程序使用的日期格式

 类似资料:
  • 我使用带有AnyLogic的外部数据库来检查数据库中是否存在数据。如果没有,那么我需要插入并执行另一个操作。然而,我得到了这个错误 jdbc。SQLServerException:索引1超出范围。 这是我的代码。 下面是完整的错误消息

  • 我从一个API调用中获得一个日期值为1598331600000 我正在尝试使用SimpleDateFormat将其转换为可读格式

  • 问题内容: 我有一个表,其中每一行都有开始和结束日期时间。这些可以是短跨度或长跨度。 我想查询具有两个开始和停止日期时间的所有行的交集的总持续时间。 如何在MySQL中做到这一点? 还是必须选择与查询开始和结束时间相交的行,然后计算每行的实际重叠并将其累加到客户端? 举个例子,使用毫秒使它更清晰: 一些行: 我们想知道这些行在1030和1100之间的总时间。 让我们计算每行的重叠: 因此,本例中的

  • 我试图创建一个抽象层来模拟Oracle 11g中的DB2函数。目标是让当前运行DB2查询的客户重新指向Oracle抽象层,而无需更改其语法。 我在ABC模式下创建了以下函数: 当我试图在SQL语句中使用它时,会出现一个错误: 如果我显式地调用模式,它会工作: 我还有一个登录触发器,可以显式地将会话的当前_模式设置为ABC。我能看到的唯一复杂之处是,时间戳在Oracle中是一个关键字,但它允许我用这

  • 在com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:191)在com.microsoft.sqlserver.jdbc.SQLServerPrearedStatement.setterGetParam(SQLServerPrearedStatement.java:9

  • 问题内容: 我有一张可以容纳一年中所有天/月的表 例如 我有一张表格,显示来自不同数据集的日期范围 例如 我如何比较这两个表以显示该特定月份的数据集中缺少哪些日期 对于上面示例中的数据集所在的示例,EG缺少日期范围01/09/2013-19/09/2013 谢谢你的帮助! 问题答案: 您可以使用CTE并通过以下方式编写查询: