首页 > 解决方案 > 存储过程在 ASP 页面中不起作用

问题描述

我们遇到了存储过程的问题。当通过 asp/vb.net 从我们的网站调用它时,它似乎没有正确执行。如果我从 SSMS 运行它,它可以工作。

我在调用时运行了调试器,传入的参数在调用 ExecuteNonQuery() 时是正确的,但它没有像它应该那样在相关表中生成任何记录。如果我使用直接在 SSMS 中调试我们的网站时看到的相同值,则存储过程会创建预期的记录。

这是我们的存储过程:

ALTER PROCEDURE [dbo].[CopyGoals](
@OldVisitID int,
@NewVisitID int,
@CreatedBy NVarChar(30)
) AS BEGIN
declare @GoalMapping As Table(OldGoalID int,NewGoalID int);

    Merge Into VisitGoals
Using(
    select GoalsID,Goal,ProgressNote,Progress,Completed,CreatedOn,CreatedBy,VisitID
    From VisitGoals
    Where VisitID = @OldVisitID
) As Src
On 1 = 0
When Not Matched By Target Then
Insert (Goal,ProgressNote,Completed,VisitID,Progress, CreatedOn, CreatedBy)
Values (Src.Goal, Src.ProgressNote, Src.Completed, @NewVisitID, Src.Progress, GetDate(), @CreatedBy)
Output Src.GoalsID As OldGoalID, inserted.GoalsID as NewGoalID
Into @GoalMapping;

Insert Into SubGoals(GoalID,VisitID,GoalText,HasCompleted,WillComplete,GoalStatus)
(
    Select GM.NewGoalID, @NewVisitID, SG.GoalText, SG.HasCompleted, SG.WillComplete, SG.GoalStatus
    From SubGoals As SG inner join @GoalMapping As GM on SG.GoalID = GM.OldGoalID
    Where SG.VisitID = @OldVisitID
)
END

这是来自我们网站页面的程序调用:

    Dim conStr As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
    Dim curUsr As New Supervisor(Context.User.Identity.Name, True)

    Using con As New SqlConnection(conStr)
        Using cmd As New SqlCommand("CopyGoals", con)
            cmd.CommandType = CommandType.StoredProcedure
            cmd.Parameters.Add("@OldVisitID", SqlDbType.Int).Value = oldVID
            cmd.Parameters.Add("@NewVisitID", SqlDbType.Int).Value = newVID
            cmd.Parameters.Add("@CreatedBy", SqlDbType.NVarChar, 30).Value = curUsr.Name

            con.Open()
            cmd.ExecuteNonQuery()
            con.Close()
        End Using
    End Using

这个过程应该做什么,如果从 SSMS 运行的话,就是查看我们的目标表,其现有 ID 与不同表中的 VisitID 对应的外键匹配,以查找与该旧访问关联的所有目标。

他们复制目标信息并将其插入到目标表中,将旧目标 ID 和新插入的目标 ID 输出到 @GoalMapping 表中。

然后它查看我们的子目标表并通过复制与我们刚刚复制的目标相关的每个子目标来执行类似的操作。无论出于何种原因,当从我们的页面调用此过程时,即使它在 SSMS 中运行,当我们向它提供与页面调试期间看到的相同的输入值时,它也无法正确执行。chrome 的调试器中没有报告错误,我们尝试使用 SQL 和正常异常将执行包装在 try 中,但它们都没有出错。我们很困惑。也许有人会发现过去几天我们没有发现的东西。

这是 Sql Profiler 的输出:

在此处输入图像描述

标签: asp.netsql-servervb.netstored-proceduresmerge

解决方案


好吧,我终于想通了。正如 Mohsin 建议的那样,存在许可问题。我以我们用于 ASP.net 连接字符串的用户身份登录,并尝试运行有问题的查询,但未能从 SSMS 生成记录。所以经过一番挖掘,我发现了这个问题:

存储过程和权限 - EXECUTE 是否足够?

当我遇到同样的错误时,这会导致这个问题:

SQL Server 主体“dbo”不存在,

结合在一起,这些问题的答案帮助我解决了这个问题。


推荐阅读