asp.net - 存储过程在 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 的输出:
解决方案
好吧,我终于想通了。正如 Mohsin 建议的那样,存在许可问题。我以我们用于 ASP.net 连接字符串的用户身份登录,并尝试运行有问题的查询,但未能从 SSMS 生成记录。所以经过一番挖掘,我发现了这个问题:
当我遇到同样的错误时,这会导致这个问题:
结合在一起,这些问题的答案帮助我解决了这个问题。
推荐阅读
- visual-studio - 在 Visual Studio 2017 中,如何/在哪里配置解决方案资源管理器的解决方案和文件夹视图?
- java - Spark 无法按包含文件夹路径的字符串进行过滤
- cucumber - Gherkin 场景、可重用步骤方法或特定方法
- android - 搜索 Android RecyclerView
- python-3.x - 删除文件夹中除最新的特定文件之外的所有文件
- android - Microsoft Azure 主机名不匹配
- kubernetes - 在唯一节点上部署 Kubernetes pod
- android - 带有 Completable 的 Android 房间插入不起作用?使用 @insert 注释的方法可以返回 void,long?
- php - 为 Laravel 的工厂在全球设置 Faker 的种子
- android - 与我的 BLE 设备配对和绑定的问题