0

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

%>
4

3 回答 3

3

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

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

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

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

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

正确的方法是使用“.CreateParameter()”方法在 ASP 中使用“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)
'-------------------------------------------------------------------'

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

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

这个怎么做:

首先,您需要知道开发人员在应用程序中使用的格式:例如在墨西哥,格式为 dd/mm/yyyy,服务器通常为英文 (mm/dd/yyyy)

Web 服务器 - 区域设置

区域设置 Windows 7

在此处输入图像描述

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

打开 SQL Server Management Studio 转到图像显示的部分并选择

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

SQL 管理工作室

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

用户语言设置

于 2012-07-19T21:39:03.280 回答
0

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

<%
' Date dd/mm/yyyy
Session.lcid=2057 '= UK English
%>
于 2013-10-01T05:00:33.867 回答
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等待发生的攻击

于 2012-07-19T20:03:29.363 回答