2009-05-11 13 views
8

Je gère un site Web ASP classique qui a un backend SQL Server 2005. Pour un petit morceau de nouvelle fonctionnalité j'ai écrit une procédure stockée pour faire un insert. C'est la seule procédure stockée par l'utilisateur dans la base de données."Impossible de trouver la procédure stockée"

Lorsque je tente d'appeler la procédure stockée à partir du code que je reçois l'erreur suivante:

 
Microsoft OLE DB Provider for SQL Server error '80040e14' 
Could not find stored procedure 'InsertGroup'. 
/newGroup.asp, line 84 

La DB utilise l'authentification SQL Server. Lorsque je me connecte au serveur de base de données dans Visual Studio en utilisant le même utilisateur/pw que dans la chaîne de connexion, la procédure stockée n'est pas visible mais toutes les tables sont.

L'utilisateur a des rôles de lecteur de données et de rédacteur de données et une autorisation d'exécution explicite sur la procédure stockée.

Qu'est-ce qui me manque? MISE À JOUR: Toutes mes excuses, l'administrateur du serveur m'a mal informé qu'il s'agissait d'un serveur 2000 lorsqu'il s'agit en fait d'un serveur 2005 (fonctionnant sous Windows Server 2003 x64).

Répondre

40

marche de la honte:

La chaîne de connexion pointait à la base de données en direct. Le message d'erreur était complètement précis - la procédure stockée était seulement présente dans la base de données de développement. Merci à tous ceux qui ont fourni d'excellentes réponses, et mes excuses pour avoir perdu votre temps.

+3

Vous devriez probablement marquer ceci comme la réponse, pour aider les autres qui ne peuvent pas lire au fond. C'est génial que vous l'ayez posté. Je suis sûr que d'autres ont fait et feront des choses semblables, et un exemple d'un oubli de ce genre aidera probablement quelqu'un d'autre à trouver son erreur. – GilM

+6

@Chloraphil: Il est toujours amusant de voir que les développeurs ont tendance à penser que l'explication la plus probable ne vaut pas la peine d'être examinée, explorant tout le reste à l'avance. :) +1 pour fournir la cause du problème. – Tomalak

+0

Je dois attendre 48 heures avant que je puisse marquer cela comme la réponse – Chloraphil

7

Vous devrez peut-être vérifier qui est le véritable propriétaire de la procédure stockée. Si c'est un utilisateur spécifique différent alors cela pourrait être la raison pour laquelle vous ne pouvez pas y accéder.

+1

Cela m'est arrivé à plusieurs reprises et est assez ennuyeux. Ouvrez la base de données dans SQL Server Management Studio si vous le pouvez et recherchez 'dbo' ou 'youruser' avant la procédure stockée. Si elle n'a pas 'dbo.', Supprimez la procédure existante et recréez-la avec comme préfixe le nom de la procédure. –

+0

Ou, juste mentionner le "propriétaire" (= "schéma") la procédure stockée appartient à l'appel - EXEC [dbo]. [InsertGroup] – Tomalak

+0

c'est dbo.InsertGroup – Chloraphil

2

Assurez-vous que votre nom de schéma est dans la chaîne de connexion?

+0

pouvez-vous être plus précis? Je ne suis pas familier avec la façon de faire cela. Quoi qu'il en soit, la base de données n'utilise que le schéma "dbo". – Chloraphil

+1

Vous pouvez avoir deux bases de données, et vous pensez que vous pointez vers une base de données, mais en réalité, vous pointez sur une autre. Ainsi, le StoredProc est sur une base de données, mais pas sur celle que vous utilisez. Cela peut être une erreur de configuration. – NealWalters

1

Il y a 2 causes:

1- Nom de la procédure de magasin Lorsque vous déclarez la procédure de magasin dans le code assurez-vous que vous n'exec ou d'exécuter mot-clé par exemple:

C#

string sqlstr="sp_getAllcustomers";// right way to declare it. 

string sqlstr="execute sp_getAllCustomers";//wrong way and you will get that error message. 

A partir de ce code:

MSDBHelp.ExecuteNonQuery(sqlconexec, CommandType.StoredProcedure, sqlexec);

CommandType.StoreProcedure recherchera uniquement le nom de procédure de stockage et ExecuteNonQuery exécutera la procédure de stockage derrière la scène.

2- chaîne de connexion:

Une autre cause est la chaîne de mauvaise connexion. Regardez à l'intérieur de la chaîne de connexion et assurez-vous que vous avez la connexion en particulier le nom de la base de données et ainsi de suite.

3

Parfois, cela peut également se produire lorsque vous appelez une procédure stockée avec des paramètres.Par exemple, si vous tapez quelque chose comme:

set @runProc = 'dbo.StoredProcedure' 
exec @runProc 

Cela fonctionne, mais:

set @runProc = 'dbo.StoredProcedure ''foods''' 
exec @runProc 

Cela jette l'erreur « ne pouvait pas trouver stockée « aliments » procédure dbo.StoredProcedure », mais cela peuvent facilement être surmontés avec parantheses comme ceci:?

set @runProc = 'exec dbo.StoredProcedure ''foods''' 
exec (@runProc) 
0

Impossible de trouver la procédure stockée signifie ---- quand vous obtenez ce .. notre code comme ce

String sp="{call GetUnitReferenceMap}"; 

stmt=conn.prepareCall(sp); 

ResultSet rs = stmt.executeQuery(); 

while (rs.next()) { 

currencyMap.put(rs.getString(1).trim(), rs.getString(2).trim()); 

J'ai 4 BDs (sample1, sample2, sample3) Mais stmt va rechercher l'emplacement est master par défaut DB alors nous allons obtenir une exception.

nous fournir le nom DB problème, résout ::

String sp="{call sample1..GetUnitReferenceMap}"; 
0

Encore une possibilité de vérifier. Liste ici parce que cela m'est arrivé et n'a pas été mentionné ;-)

J'ai accidentellement ajouté un caractère espace à la fin du nom. Beaucoup d'heures à essayer des choses avant de finalement le remarquer. C'est toujours quelque chose de simple après l'avoir compris.

Questions connexes