2012-07-19 40 views
0

我正在将ASP经典应用程序移至新服务器。我没有开发应用程序,我没有使用ASP的经验,希望有人能指导我。ASP Classic&SQL日期超出范围错误

一个在应用程序的页面删除此错误:

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 

数据库上的日期格式writen这样的:

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 

%> 
+0

检查旧服务器的日期格式。我怀疑新环境的日期本地化与旧服务器不同。 (具体来说,这是否也是一个新的SQL服务器?连接的默认日期格式看起来像是期望不同的顺序) – 2012-07-19 20:04:35

+0

是的,它是一个从2000到2012的新sql服务器 – 2012-07-19 20:40:18

+0

您肯定希望至少更改您的所有请求。用双引号或空字符串替换单引号的表单,但更好的是,更改代码以使用存储过程或参数化查询,否则任何人都将能够看到您的数据库,更新和删除您的数据 – Rodolfo 2012-07-19 21:32:29

回答

2

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

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

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

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

我给你3个候选条件解决这个:

正确的方法是使用“ADODB.Command”对象使用方法“.CreateParameter()”,并追加到在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和常用的服务器的格式是英语(毫米/ DD/YYYY)

Web服务器 - 区域设置

Regional Setting Windows 7

enter image description here

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

打开SQL Server Management Studio中去那个图像showss的部分,并选择访问应用程序的数据库

SQL management Studio

Cahnge默认的

用户语言转换为应用程序使用的日期格式

User Language Setting

+0

嗨拉斐尔!请告诉如何做快速修复。我已经改变了语言设置,但我不知道如何去做其余的事情。我是一名web设计师,所以这超出了我的技能。格拉西亚斯! – 2012-07-19 21:54:05

+0

@RodolfoAwenyddLunaBernal答案展开 – Rafael 2012-07-19 22:08:41

+0

我会将所有内容都改为美国英语,因为这是原始服务器的默认语言。我现在无法重新启动服务器(人们仍在这里工作),但会在几个小时内告诉你它是如何工作的。非常感谢你。 – 2012-07-19 22:25:01

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攻击等待发生

0

ASP从OS获取的日期不会从数据库中,一个常见的错误,但它是通过使用解决:

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