2011-10-12 12 views
0

Je le tableau suivant:Impossible d'insérer l'enregistrement de la procédure stockée appelée de service Web

CREATE TABLE [dbo].[omgbbq](
    [tbl_key] [int] IDENTITY(1,1) NOT NULL, 
    [name] [varchar](10) NOT NULL, 
    [id] [int] NULL, 
CONSTRAINT [PK_omgbbq] PRIMARY KEY CLUSTERED 
(
    [tbl_key] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
    ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

... et la procédure stockée suivante:

CREATE PROCEDURE sp_omgwth 
    @name VARCHAR(10), 
    @id INT 
AS 
BEGIN 
    INSERT INTO omgbbq (name, id) VALUES (@name, @id); 
    SELECT MAX(tbl_key) AS Max_tbl_key FROM omgbbq; 
END 

J'ai ajouté un seul enregistrement en appelant la procédure de SSMS:

EXEC sp_omgwth 'Gareth', 2 

et obtenir

tbl_key,name,id 
1,Gareth,2 

Jusqu'ici, tout va bien. Un collègue essaie de l'appeler à partir d'un service Web et obtient le retour 'Max_tbl_key' 2

Également comme prévu. Toutefois, l'enregistrement n'apparaît pas dans le tableau. Lorsque j'ajoute un nouveau record en appelant le SP de SSMS, nous voyons ce qui suit dans le tableau:

tbl_key,name,id 
1,Gareth,2 
3,Gawain,4 

Il est comme il a ajouté l'enregistrement, qui incrémente la valeur d'identité, mais ... Je ne savoir, roulé en arrière ou quelque chose.

Des idées? Nous nous connectons tous les deux au serveur en tant que même utilisateur, donc il ne semble pas que cela puisse être un problème d'autorisations d'identification. Nous obtenons ce même comportement d'une autre table et d'un autre SP, ce qui explique pourquoi nous avons créé ces deux tests.

+1

Vous ne devez JAMAIS ** utiliser 'SELECT MAX (tbl_key) ...' pour obtenir la valeur d'une colonne 'IDENTITY' - utilisez' SELECT SCOPE_IDENTITY() ... 'à la place! Beaucoup plus sûr - ne cassera pas dans les situations de concurrence! –

+0

Je devrais probablement préciser que les développeurs ont retracé le problème autant qu'ils le pouvaient. Ils ont constaté que l'instruction SQL transmise fonctionnait parfaitement lorsqu'elle était copiée et collée dans SSMS. En outre, l'utilisation de la même base de code pour ajouter un enregistrement via une instruction INSERT a également fonctionné. Il semble y avoir quelque chose d'étrange à propos du webservice appelant une procédure stockée avec un INSERT. – mdoyle

+0

D'accord avec le commentaire 'marc'' ci-dessus. Vous ne devriez pas utiliser 'MAX'. Veuillez poster votre code de service Web. Être dans une transaction qui ne s'engage jamais semble faisable. –

Répondre

0

Le meilleur moyen de savoir ce qui se passe dans la base de données est d'exécuter une trace. Exécutez SQL Server Profiler et appelez le service Web vers la procédure stockée. Puis regardez les événements pour découvrir ce qui se passe.

C'est un problème énigmatique, mais regarder une trace vous dira quoi et pourquoi.

+0

Bonne réflexion.La trace montre qu'il était en fait dans une transaction qui a été annulée: 'Utilisons [tha_db] aller BEGIN TRAN go exec sp_omgwtf 'mat', '2' vont ROLLBACK TRAN aller BEGIN TRAN go' – mdoyle

+0

Les développeurs vont chercher à voir où leur code aurait pu le faire demain. Merci pour toutes les idées et les conseils! – mdoyle

+0

@mdoyle pas de problème, heureux d'aider :) –

0

Vous devez peut-être fournir un exemple d'appel SQL Client à partir du code du service Web. Vous pouvez essayer de définir et de vérifier l'état de retour EXECUTE.

+0

L'appel du client n'a rien d'extraordinaire, je n'y ai pas accès mais je peux l'obtenir si j'en ai vraiment besoin. Je pense que le point important est que l'appel fonctionne bien en appelant n'importe quelle procédure stockée qui n'a pas un INSERT dedans. – mdoyle

+0

En outre, pourriez-vous clarifier ce que vous entendez par «définir et vérifier l'état de retour EXECUTE»? – mdoyle

Questions connexes