0

我正在研究几年前有人写的桌面应用程序、数据库、网络服务器访问组合。我的任务是做一些优化/重构,并为这个应用程序引入新特性。我在开发Web应用程序方面没有太多经验,所以我很难找到解决下面描述的问题的方法,希望有人能帮助我。

该网络应用程序是用 ASP 和 VBScript 编写的,具有一些不影响我的问题的小型 javascript 函数。它使用 ADODB 与数据库进行通信。

该数据库是一个 MS-SQLserver 2008 数据库。

桌面应用程序是用 C++/CLI 编写的,使用 .Net 内置功能与数据库通信。使用此应用程序,一切正常。

为了引入一些特性,我需要向数据库中的表添加新列。主表的插入和更新是通过存储过程完成的。我添加了一个名为“位”类型的“内部”列:

    ALTER TABLE maintable
    ADD internal bit
    GO

我更改了用于插入和更新的存储过程,只需为其添加内部列和参数。我只做了这些改变:

  • 参数的 1x 行
  • 在插入的列和值列表中添加了内部
  • 添加了设置内部列和更新参数

在任何更改之前已经工作的 vbscript 中,我添加了用于将内部值附加为新参数的代码(插入和更新相同):

    sqlcmd.Parameters.Append(sqlcmd.CreateParameter("@internal",11,1))
    sqlcmd.Parameters("@internal")=0

在这些更改之后,vbscript 的更新和插入过程停止工作。我为参数尝试了几种数据类型,并更改了列(不同的名称,不同的数据类型)。没有任何效果。当直接在数据库中执行以及由桌面应用程序使用时,存储过程本身可以正常工作。
我开始通过打印一些调试信息等来调试所有内容。我在存储过程中添加了 try/catch 和一个输出参数,以根据这个答案得到一些错误,我将所有输入参数选择到一个 varchar 输出参数中。这导致了下一个奇怪的结果。
在更新“工作”时(因为存储过程没有导致数据库错误,并且我得到了没有显示错误值的输入参数信息,但没有执行更新)插入没有以任何方式工作。我的跟踪输出打印到sqlcmd.Execute,这条线似乎崩溃了,因为这条线之后的跟踪输出没有打印。只要我不使用外参数,插入本身就不起作用,但所有跟踪输出都被打印出来。我尝试在执行代码后直接检索有关可能的数据库错误的信息:

    DECLARE @ErrorVariable INT;

    SET @ErrorVariable = @@ERROR;
    SELECT @ErrorVariable AS ErrorID,
        text
        FROM sys.messages
        WHERE message_id = @ErrorVariable;
    GO

没有数据库错误。

从桌面应用程序方面一切正常。如前所述,直接在数据库中执行的存储过程将正常工作。我想错误是在 web-scripting-stuff 中的某个地方。所以现在这里是具体的问题:

  1. 为什么在向数据库添加新列(它在那里)并且存储过程或 vbscript 中没有语法错误时,存储过程不能(正确)工作?
  2. 为什么sqlcmd.Execute向插入存储过程添加外参数时停止工作?存储过程中的 try 块包括“AS BEGIN”和“END”之间的所有内容,在“END”之前有 catch 块。这里的语法也是正确的。
4

1 回答 1

1

尝试在 asp 结束时捕获错误。

On Error Resume Next
sqlcmd.Execute

for each objerr in yourconnection.Errors
    Response.write objerr.Description & "<br/>"
next

On Error GoTo 0

请检查此链接:

ADO 连接对象错误集合

于 2013-09-24T05:49:48.590 回答