2010-05-18 7 views
4

J'essaie de faire une insertion d'une base de données appelée suspension à la table appelée Notification dans la base de données ANimals. Ma procédure stockée est la suivante:INSERT procédure stockée ne fonctionne pas?

 ALTER PROCEDURE [dbo].[spCreateNotification] 
     -- Add the parameters for the stored procedure here 
     @notRecID int, 
     @notName nvarchar(50), 
     @notRecStatus nvarchar(1), 
     @notAdded smalldatetime, 
     @notByWho int 
    AS 
    BEGIN 
     -- SET NOCOUNT ON added to prevent extra result sets from 
     -- interfering with SELECT statements. 
     SET NOCOUNT ON; 

     -- Insert statements for procedure here 
     INSERT INTO Animals.dbo.Notification 
(
NotRecID, 
NotName, 
NotRecStatus, 
NotAdded, 
NotByWho 
) 
values (@notRecID, @notName, @notRecStatus, @notAdded, @notByWho); 
    END 

L'insertion nulle est de reconstituer une colonne qui, autrement, ne sera pas rempli, je l'ai essayé différentes façons, comme l'utilisation également les noms des colonnes après le nom de la table et alors seulement indiquer en valeurs les champs que j'ai. Je sais que ce n'est pas un problème de la procédure stockée parce que je l'ai exécuté à partir du studio de gestion du serveur sql et cela fonctionne en introduisant les paramètres. Alors je suppose que le problème doit être dans le référentiel lorsque j'appelle la procédure stockée:

public void createNotification(Notification not) 
     { 
      try 
      { 
       DB.spCreateNotification(not.NotRecID, not.NotName, not.NotRecStatus, 
             (DateTime)not.NotAdded, (int)not.NotByWho); 

      } 
      catch 
      { 
       return; 
      } 
     } 

Et j'appelle ici la méthode:

public void createNotifications(IList<TemporalNotification> notifications) 
     { 

      foreach (var TNot in notifications) 
      { 
       var ts = RepositoryService._suspension.getTemporalSuspensionForNotificationID(TNot.TNotRecID); 
       Notification notification = new Notification(); 
       if (ts.Count != 0) 
       { 
        notification.NotName = TNot.TNotName; 
        notification.NotRecID = TNot.TNotRecID; 
        notification.NotRecStatus = TNot.TNotRecStatus; 
        notification.NotAdded = TNot.TNotAdded; 
        notification.NotByWho = TNot.TNotByWho; 

        if (TNot.TNotToReplace != 0) 
        { 
         var suspensions = RepositoryService._suspension.getSuspensionsAttached((int)TNot.TNotToReplace); 
         foreach (var sus in suspensions) 
         { 
          sus.CtsEndDate = TNot.TNotAdded; 
          sus.CtsEndNotRecID = TNot.TNotRecID; 
          DB.spModifySuspensionWhenNotificationIsReplaced((int)TNot.TNotToReplace, (int)sus.CtsEndNotRecID, (DateTime) sus.CtsEndDate); 
         } 
         DB.spReplaceNotification((int)TNot.TNotToReplace, DateTime.Now); 
         createNotification(notification); 
        } 
        else 
        { 
         createNotification(notification); 
        } 
       } 
      } 
      deleteTemporalNotifications(notifications); 
     } 

Il n'enregistre pas la valeur de la base de données. J'ai débogué et je me suis énervé à ce sujet, parce que ça marche quand je l'exécute manuellement, mais pas quand j'automatise le processus dans mon application. Est-ce que quelqu'un voit quelque chose de mal avec mon code?

Merci

EDIT: Ajout de plus de code. Cela ne fonctionne toujours pas en changeant cela, je veux dire, la procédure fonctionne si je l'exécute, donc je ne sais pas ce qui pourrait être l'erreur. En fait, je n'ai aucune erreur. Pourrait-il être question de writin dans une table qui n'est pas dans la base de données où vous avez votre procédure stockée?

+0

Lorsque vous entrez dans le code, il ne reçoit en fait au point d'appeler la procédure? – NotMe

+0

Oui, oui, et ça passe comme si rien n'était là. Je vérifie la table après l'appel et rien ne se passe dans la base de données. Je ne sais pas quoi d'autre à essayer, jamais été coincé lol – vikitor

+0

Avez-vous modifié votre procédure pour énumérer les colonnes de votre clause INSERT? – Thomas

Répondre

0

ok, j'ai finalement trouvé ce que Noone a réalisé lol. C'était une erreur très stupide mais je me suis vraiment fâché jusqu'à ce que je trouve le problème. Ce ne fut pas un problème d'autorisations, le problème était que je ne procédait pas à la procédure de ma demande, alors où je l'ai écrit ceci:

DB.spCreateNotification(not.NotRecID, not.NotName, not.NotRecStatus, 
             (DateTime)not.NotAdded, (int)not.NotByWho); 

Quand je devais écrire:

DB.spCreateNotification(not.NotRecID, not.NotName, not.NotRecStatus, 
             (DateTime)not.NotAdded, (int)not.NotByWho).Execute(); 

si Comme vous le voyez, je concentrais mes efforts sur des choses beaucoup plus complexes et je ne l'exécutais même pas ... lol.

Merci à tous pour vos réponses de toute façon :)

3

Précisez votre nom de colonne:

INSERT INTO Animals.dbo.Notification 
(RecID, Name, RecStatus, Added, ByWho) 
VALUES 
(@notRecID, @notName, @notRecStatus, @notAdded, @notByWho); 
+0

Je laisserais la valeur nulle. Comme il n'est pas nécessaire, le serveur SQL remplira la valeur NULL s'il n'obtient pas de valeur de la requête d'insertion. – Rob

+0

Oui, bien sûr! Fixé. –

3

Je préciserais vos noms de colonnes et incude la EXCLURE NULL à tous pour cette colonne. Laissez simplement SQL Server gérer cela.

INSERT INTO Animals.dbo.Notification 
(
RecID, 
[Name], 
RecStatus, 
Added, 
ByWho 
) 
values (@notRecID, @notName, @notRecStatus, @notAdded, @notByWho); 
+0

pourquoi mettez-vous ces parenthèses dans le nom? Ont-ils une signification particulière? – vikitor

+0

Ce n'est pas nécessaire pour [Nom]. Cependant, chaque fois que vous utilisez un mot-clé, vous devez le placer entre crochets afin que le processeur de requête puisse mieux l'identifier comme une colonne. Voir http://msdn.microsoft.com/en-us/library/ms189822.aspx pour une liste. – NotMe

+0

merci, mais pour mon cas ce n'est pas le problème. J'ai édité le post pour montrer ce que j'ai au cas où quelqu'un remarquerait l'erreur. Je continue à essayer différentes choses, mais pas de succès jusqu'à maintenant. – vikitor

3

Exécutez le profileur lorsque vous essayez de l'exécuter à partir de l'application et de voir les valeurs qu'il envoie réellement. Cela vous dira si l'application crée la bonne exécution pour exec le proc.

De plus, il peut s'agir d'un problème de permissions.

+0

Je pense que le profileur n'est pas installé. J'ai essayé de chercher un autre mais je ne sais pas comment l'utiliser, je vais continuer à chercher. Dans le cas où il se trouve être un problème de permissions ne serait-il pas échouer et signaler une erreur? – vikitor

+0

Installer le profileur. Il peut vous faire économiser des heures de headbanging si vous apprenez à l'utiliser. –

1

"Pourrait-il être question de writin dans une table qui ne se trouve pas dans la base de données où vous avez votre procédure stockée?"

Cela peut être le problème. Vous pouvez essayer d'ajouter la clause "WITH EXECUTE AS OWNER" à votre procédure stockée afin qu'elle s'exécute en tant que propriétaire de la procédure stockée. Ou accorder des autorisations d'écriture pour l'utilisateur exécutant à la table.

http://msdn.microsoft.com/en-us/library/ms188354.aspx

Questions connexes