2009-04-07 13 views
2
Set rs = command.Execute 
if not rs.EOF then 
    'logic here 
end if 

Le code ci-dessus échoue à la ligne 2, parce que rs est fermé (probablement le fournisseur OLEDB cernées, à tort, qu'il est une commande d'insertion donc pas besoin de retourner quoi que ce soit). La commande est une instruction d'insertion quelque chose comme:VB6 ADO Set rs = Command.Execute

Insert into log(Name,Value) values("xxx", 123); select scope_identity() 

J'ai besoin de l'identité du serveur en un aller-retour. Des idées? PS: Mise à jour de l'instruction d'insertion avec les noms de champs (merci Eduardo), mais ce n'est pas le problème.

Répondre

6

Votre problème est que la source de données renvoie deux jeux d'enregistrements. Cela est dû au paramètre NOCOUNT de la base de données. Le premier jeu d'enregistrements est utilisé uniquement pour renvoyer les enregistrements affectés à partir de l'instruction d'insertion. Le deuxième jeu d'enregistrements renvoie les résultats de l'appel SELECT SCOPE_IDENTITY. Donc, vous devez faire:

If rs.State = adStateClosed Then 
    Set rs = rs.NextRecordset() 
End If 

Ensuite, vous pouvez vérifier EOF et tout ça. Mais habituellement, j'évite tout cela et mets des choses comme ça dans une procédure stockée. Puis j'ai SET NOCOUNT ON dans la procédure stockée. Et renvoyez l'ID à la fin de la procédure stockée. À l'heure actuelle, vos insertions pourraient être simples comme ça, mais la logique pourrait se développer. En le mettant dans une procédure stockée, vous pouvez simplement changer la procédure stockée et ne pas avoir à modifier votre application VB compilé. Il isole également un peu le code de la base de données.

Ce que vous ne voulez pas faire est SET NOCOUNT ON dans votre déclaration là-bas. Je pense que cela affecte toute la connexion sinon la base de données entière.

1

Sélectionnez @@ Identity De TableName doit donner le dernier id Inséré

+0

N'utilisez jamais @@ Identity en faveur de scope_identity() sauf si vous avez une bonne raison de le faire. –

+0

scope_identity me donnera le dernier identifiant inséré ainsi le problème est de savoir comment le faire en un aller-retour. –

0

Vous pouvez essayer de retourner l'ID dans une fonction.

CREATE FUNCTION dbo.MyFunc (@name varchar(10), @value varchar(10)) 
RETURNS int 
AS 
BEGIN 
    DECLARE @rtn int 

    Insert into log(Name,Value) 
    values("xxx", 123); 

    select @rtn = scope_identity() 
    RETURN @rtn; 
END 

Bien que je pense que ce que vous avez ci-dessus, où vous faites une insertion, puis une sélection devrait fonctionner d'une certaine manière.

1

Est-ce SQL Server? Essayez d'ajouter SET NOCOUNT ON au début de votre SQL, par exemple.

SET NOCOUNT ON; 
Insert into log(Name,Value) values("xxx", 123); 
select scope_identity()