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

时间:2012-07-19 18:31:13

标签: sql date asp-classic

我正在将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

%>

3 个答案:

答案 0 :(得分:2)

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

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

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

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

我给你3个可能的解决方案:

正确的方法是使用方法“.CreateParameter()”使用“ADODB.Command”对象在ASP查询中正确参数化并将其附加到命令中。问题是你需要添加一大堆额外的代码来实现这一目标。

示例代码

'-------------------------------------------------------------------'
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服务器 - 区域设置

Regional Setting Windows 7

enter image description here

默认语言设置 - 数据库服务器

打开SQL Server Management Studio转到图像showss部分,然后选择

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

SQL management Studio

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

User Language Setting

答案 1 :(得分:0)

尝试将插入日期行位更改为

SQL = "Insert into tbEntregas(TituloEntrega,Date,Estatus,IDCuestionario) values('" & _  
        tituloEntrega & "',Convert(datetime, '" & date_number & "')," & estatus & ",'" & idCuestionario & "')"  

的更新
SQL = "update tbEntregas Set TituloEntrega = '" & tituloEntrega & _  
    "', Convert(datetime, '" & date_number & "'),Estatus=" & estatus & _  
    ",IdCuestionario='" & idCuestionario & "' Where idEntrega = " & idEntrega  

您还应该知道,这段代码是SQL Injection等待发生的攻击

答案 2 :(得分:0)

ASP从操作系统获取日期而不是从数据库中获取日期,这是一个常见错误,但它可以通过使用来解决:

<%
' Date dd/mm/yyyy
Session.lcid=2057 '= UK English
%>