2012-07-19 43 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 
%>