我正在将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
%>
答案 0 :(得分:2)
好的,当您的查询未正确参数化时,这是一个常见问题。我认为这是一种不好的做法。
当开发人员将日期格式硬编码到应用程序中时,会发生此问题。 它受到以下一个或多个因素的影响:
日期必须采用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服务器 - 区域设置
默认语言设置 - 数据库服务器
打开SQL Server Management Studio转到图像showss部分,然后选择
访问应用程序数据库的用户
将默认语言改为应用程序使用的日期格式
答案 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
%>