Asp.net SP明确存在时未找到

Asp.net SP明确存在时未找到,asp.net,sql-server,Asp.net,Sql Server,我将一个数据库从一个实时MSSQL服务器复制到我的本地服务器,并且能够正确登录。但是,我遇到了一个问题,当调用存储过程时,Asp.Net应用程序会一直告诉我SP不存在,而实际上它确实存在 我正在使用windows身份验证,但在服务器上我正在使用凭据,这可能是问题所在吗 此外,所有SP的名称都附加了我的在线用户名,如username.StoredProcedurenName中所示 请帮帮我,我已经试着解决这个问题好几个小时了 我刚刚注意到,当我尝试从SQL Management Studio运行S

我将一个数据库从一个实时MSSQL服务器复制到我的本地服务器,并且能够正确登录。但是,我遇到了一个问题,当调用存储过程时,Asp.Net应用程序会一直告诉我SP不存在,而实际上它确实存在

我正在使用windows身份验证,但在服务器上我正在使用凭据,这可能是问题所在吗

此外,所有SP的名称都附加了我的在线用户名,如
username.StoredProcedurenName
中所示

请帮帮我,我已经试着解决这个问题好几个小时了

我刚刚注意到,当我尝试从SQL Management Studio运行SP时,它可以工作,但它会将用户名附加到SP,例如:

USE [DBNAME]
GO

DECLARE @return_value int

EXEC    @return_value = [username].[SPNAME]

SELECT  'Return Value' = @return_value

GO

如果我删除用户名,它会显示相同的内容(SP未找到)。如何解决这个问题?

我怀疑您在调用存储过程时没有指定模式。调用存储过程(或访问表、视图等)时,如果该存储过程不在帐户配置的默认模式(通常为dbo)中,则需要显式地包括该模式,如下面的sql命令

SqlCommand cmd  = new SqlCommand("username.StoredProcedurenName", mySqlConnection);

很可能是杰森说的。解决方案与权利和所有权有关。当您在SQL Management Studio中看到SP时,在可编程性->存储过程下,您的SP应该有一个前缀,如“dbo.”或“GateKeeper”

如果SP以“dbo.”作为前缀,则连接到DB的用户帐户只是数据库所有者(dbo)组的一部分,否则您将无法访问它。因此,您可以将用户添加到该组,或者使用该帐户创建存储过程(“创建过程spBlahBlah as..”),以计划在其下运行该程序;当您调用它时,使用“exec GateKeeper.spBlahBlah”来规定Schema.StoredProcedureName


这是你的两个选择

您是否尝试过使用Windows身份验证连接到SSMS以在查询窗口中运行存储过程?是的,如果我从SQL Management Studio手动登录,它会工作。这真奇怪!它是使用SSMS的同一个帐户,也是ASP.NET web应用程序的进程所有者?我编辑了这个问题。如果用一个部件名调用时找不到它,请检查默认架构是什么。不过,最好还是使用两部分名称,而不是隐式名称解析;我不想更改程序中的每个SP名称。我决定让我所有的SP名称都完全限定。@使用完全限定名称的守门人是更好的方法,它可以避免任何潜在的混淆,并使您的应用程序能够在将来处理同一数据库中多个架构的可能性是的,我理解,但这只是一个临时脱机数据库,所以我需要一个快速修复程序来运行它。当我用acc创建一个新SP时,它被创建为
dbo.SPNAME
,但所有其他SP都显示为
gatekeeper.SPNAME
。我不想使用完全限定名,因此如何将当前帐户的默认架构更改为GateKeeper,使其运行SP?很抱歉,响应太晚。。我在欧洲。因为我们只是在讨论临时脱机DB,所以最简单的方法可能是将GateKeeper添加到DBO组,并确保任何SP都是由DB所有者或DBO组中的任何成员创建的。因此,脚本然后删除所有标记为TheGateKeeper.SP的SP,并将它们作为dbo组中的某个人重新创建。通过这样做,您将始终拥有dbo权限,并且您将能够在不规定模式的情况下运行SPs。。。一切都将是dbo。