0

ASPクラシックアプリを新しいサーバーに移動しています。私はアプリを開発しておらず、ASPの経験もありません。誰かが私を導いてくれることを願っています。

アプリのページの1つがこのエラーをドロップします:

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

クエリが正しくパラメータ化されていない場合、これは一般的な問題です。これは悪い習慣だと思います。

この問題は、開発者が日付形式をアプリケーションにハードコードするときに発生します。そして、それは以下の要因の1つ以上の影響を受けます。

  • IIS/Webサーバーの地域/言語設定の変更
  • データベースユーザーの言語設定の変更

問題を回避するために、日付はODBC標準形式('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)
'-------------------------------------------------------------------'

実用的な方法は、ハードコードされた形式を標準的な形式に変更して、現在および将来発生する可能性のある問題を回避することです。

簡単な解決策は、過去の実装と一致するように、Webサーバーの地域設定またはデータベースサーバーの言語設定を変更することです。

これを行う方法:

まず、開発者がアプリケーションで使用した形式を知る必要があります。メキシコの例では、形式はdd / mm / yyyyであり、通常、サーバーは英語(mm / dd / yyyy)です。

Webサーバー-地域設定

地域設定ウィンドウ7

ここに画像の説明を入力してください

デフォルトの言語設定-データベースサーバー

SQL Server Management Studioを開き、画像が表示するセクションに移動して、

アプリケーションデータベースにアクセスするユーザー

SQL Management Studio

デフォルトの言語を、アプリケーションで使用される日付形式に変更します

ユーザー言語設定

于 2012-07-19T21:39:03.280 に答える
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 に答える
0

ASPは、データベースからではなくOSから日付を取得します。これは一般的なエラーですが、次の方法で解決されます。

<%
' Date dd/mm/yyyy
Session.lcid=2057 '= UK English
%>
于 2013-10-01T05:00:33.867 に答える