[英]Migration Issue: error '80040e14' in ASP classic application from Windows server 2003/SQL Server 2000 to Windows Server 2008 R2/SQL Server 2012
首先,我想讓您知道我不是工程師,我只是一個在工作限制內工作的網頁設計師。 我們有一堆以ASP classic制作的應用程序,它們在Windows Server 2003 / SQL 2000環境中運行。 該公司購買了帶有Windows Server 2008R2和SQL 2012的新服務器,他們為我提供了將應用程序遷移到新服務器的任務。 我閱讀並閱讀了許多有關此問題的手冊和文檔,為期數周,除其中一個應用程序外,我完成了我的任務。 該應用程序可生成並創建界面並回答調查。 這很奇怪,因為登錄頁面有效:您輸入用戶名並通過,然后進入管理區域,存儲在數據庫中的選項顯示沒有問題,但是當我嘗試輸入調查問卷回答瀏覽器時,這個:
Microsoft OLE DB提供程序的ODBC驅動程序錯誤'80040e14'
[Microsoft] [ODBC SQL Server驅動程序] [SQL Server]'@ errno'附近的語法不正確。
/SEL/Encuesta/preguntatodo_nuevo.asp,利納(Línea)108
好吧,這是我在lnea的/SEL/Encuesta/preguntatodo_nuevo.asp中找到的東西:
sSQL = "Update UsuariosClima set NumCuestContestados = NumCuestContestados+1 Where IDUsuario = " & IDUsuario
conn.Execute(sSQL)
我知道很難僅憑這些信息來幫助我,所以如果您需要更多數據,請告訴我。 我不希望您去做我的工作,如果有人可以帶領我朝正確的方向前進,我將自己繼續。 非常非常感謝你。
請記住:我不是一個egineer,像我小時候向我解釋。
更新-UsuariosClima中的觸發器:
tD_Usuarios:
ALTER trigger tD_Usuarios on dbo.UsuariosClima for DELETE as
begin
declare @errno int,
@errmsg varchar(255)
if exists (
select * from deleted,AccesoCuestionarioClima
where
AccesoCuestionarioClima.IDUsuario = deleted.IDUsuario
)
begin
select @errno = 30001,
@errmsg = 'Cannot DELETE "Usuarios" because "AccesoCuestionario" exists.'
goto error
end
if exists (
select * from deleted,AccesoClienteClima
where
AccesoClienteClima.IDUsuario = deleted.IDUsuario
)
begin
select @errno = 30001,
@errmsg = 'Cannot DELETE "Usuarios" because "AccesoCliente" exists.'
goto error
end
if exists (
select * from deleted,PertenenciaClima
where
PertenenciaClima.IDUsuario = deleted.IDUsuario
)
begin
select @errno = 30001,
@errmsg = 'Cannot DELETE "Usuarios" because "Pertenencia" exists.'
goto error
end
update RespuestaCuestionariosClima
set
RespuestaCuestionariosClima.IDUsuario = NULL
from RespuestaCuestionariosClima,deleted
where
RespuestaCuestionariosClima.IDUsuario = deleted.IDUsuario
return
error:
raiserror @errno @errmsg
rollback transaction
end
tU_Usuarios:
ALTER trigger tU_Usuarios on dbo.UsuariosClima for UPDATE as
begin
declare @numrows int,
@nullcnt int,
@validcnt int,
@insIDUsuario int,
@errno int,
@errmsg varchar(255)
select @numrows = @@rowcount
if
update(IDUsuario)
begin
if exists (
select * from deleted,AccesoCuestionarioClima
where
AccesoCuestionarioClima.IDUsuario = deleted.IDUsuario
)
begin
select @errno = 30005,
@errmsg = 'Cannot UPDATE "UsuariosClima" because "AccesoCuestionarioClima" exists.'
goto error
end
end
if
update(IDUsuario)
begin
if exists (
select * from deleted,AccesoClienteClima
where
AccesoClienteClima.IDUsuario = deleted.IDUsuario
)
begin
select @errno = 30005,
@errmsg = 'Cannot UPDATE "UsuariosClima" because "AccesoClienteClima" exists.'
goto error
end
end
if
update(IDUsuario)
begin
if exists (
select * from deleted,PertenenciaClima
where
PertenenciaClima.IDUsuario = deleted.IDUsuario
)
begin
select @errno = 30005,
@errmsg = 'Cannot UPDATE "UsuariosClima" because "PertenenciaClima" exists.'
goto error
end
end
if
update(IDUsuario)
begin
update RespuestaCuestionariosClima
set
RespuestaCuestionariosClima.IDUsuario = NULL
from RespuestaCuestionariosClima,deleted
where
RespuestaCuestionariosClima.IDUsuario = deleted.IDUsuario
end
return
error:
raiserror @errno @errmsg
rollback transaction
end
乍一看,我相信您描述的第一個錯誤可能只是在tU_Usarios觸發器中對raiserror的調用中的語法錯誤。 我相信這在上面的“第108行”中被反映為錯誤,因為更新是導致該錯誤的原因,但是調用RAISERROR的代碼將問題回溯到原始語句。 當更新發生時,觸發器將觸發,捕獲的觸發器代碼中發生錯誤,但是當控制權傳遞給調用RAISERROR的代碼時,語法錯誤出現在“ @errno”。
我認為需要在逗號分隔的列表中提供RAISERROR的參數,並將其包含在括號中,等等。並且我相信參數的最小數量為三個-消息ID或字符串,其后是嚴重性代碼,然后是狀態代碼。 通常,最后兩個值最終分別為16和1。
我把答案放在這里以使其更明顯。 謝謝。
由於它們都將遷移到SQL Server 2012,因此應將兩個觸發器(更新和刪除)都從RAISERROR更改為THROW。為此,他應將行(在兩者中)更改為THROW @errno,@ errmsg,2; –鬼
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.