2009-11-03 5 views
0

J'ai un projet carsale. Cela fonctionne complètement sur localhost. J'ai une page "AddCar.aspx" qui insère un enregistrement de voiture avec les caractéristiques de la voiture. Les caractéristiques de la voiture sont sélectionnées avec des cases à cocher. Si je ne coche pas de case, il n'y a pas de problème. Mais si je cocher l'une des cases de fonction, ma page donne une erreur comme ceci: «Les sous-requêtes ne sont pas autorisés dans ce contexte Seules les expressions scalaires sont autorisés. »Utilisation d'une sous-requête dans une instruction d'insertion dans SQL Server 2005

Et mon code est comme ça:

foreach (DataListItem item in Security1.Items) { 
     CheckBox CheckBox1 = (CheckBox)item.FindControl("CheckBox1"); 

     if (CheckBox1.Checked) { 
      HiddenField h = (HiddenField)item.FindControl("FeaID"); 
      string add = "Insert into Carfeature (RecID,FeatureID) values ((select Max(RecID) from record),@FeatureID)"; 
      cmd[k] = new SqlCommand(); 
      cmd[k].CommandType = CommandType.Text; 
      cmd[k].Parameters.Add("@FeatureID", SqlDbType.Int).Value = h.Value; 
      cmd[k].CommandText = add; 
      k++; 
     } 
} 

Y at-il une solution?

Répondre

5

Changez votre SQL à ceci:

Insert into Carfeature (RecID,FeatureID) 
select Max(RecID), @FeatureID from record 
+0

m'a battu de 11 secondes :-) – brendan

2

Je pense que vous pouvez simplement reformater votre sql et de le faire de cette façon:

Insert into Carfeature (RecID,FeatureID) select Max(RecID), @FeatureId from record 
8

Deux choses, tout d'abord, essayez ce SQL :

Insert into Carfeature (RecID,FeatureID) 
select Max(RecID), @FeatureID from record; 

En second lieu, la Max(RecId) est problématique si vous avez plusieurs threads faire. Savez-vous que vous pouvez obtenir la dernière identité insérée? N'est-ce pas ce que tu veux faire ici? Si vous venez d'insérer un enregistrement dans la table record à l'étape précédente

select SCOPE_IDENTITY() as RecID; 

vous donnera la RecID correcte dans un fil de manière sûre.

+0

N'utilisez jamais @@ identity pour cela, utilisez plutôt la fonction scope_identity. @@ identity donnera de mauvaises réponses quand quelqu'un met un trigger sur la table. Très mauvaise pratique d'utiliser @@ identity à cette fin. – HLGEM

+0

@HLGEM: Bonne suggestion. J'ai mis à jour ma réponse pour utiliser SCOPE_IDENTITY(). – Asaph

0

Ceci est très probablement dû au contrôle de simultanéité. Une façon que je vous recommande de le faire sur SQL Server 2005 est de changer votre instruction SQL pour les suivants à l'aide CTE (http://msdn.microsoft.com/en-us/library/ms190766.aspx):

with MaxId as 
(
    select Max(RecID) 
    from record 
) 
insert into Carfeature (RecID,FeatureID) 
select @MaxID, @FeatureID 
from MaxId 
+0

-1 Le problème n'est pas lié à la concurrence, et le CTE n'ajoute rien à la solution. Je me demande pourquoi cela a été voté. – Andomar

0

amis, vous tous répondu vrai, merci beaucoup. J'ai changé mon code comme ça et ça a marché:

Insert into Carfeature (RecID,FeatureID) select Max(RecID), @FeatureID from record 

Mais je ne sais pas comment définir réponse acceptée, parce que toutes les réponses sont vraies :)

+0

Lorsque plusieurs réponses sont à peu près aussi bonnes, les gens marquent généralement la réponse la plus rapide comme acceptée – Andomar

+0

@Mehmet Kaleli: Pour marquer une réponse comme acceptée, cliquez sur la case à côté de la réponse que vous souhaitez accepter. – Asaph

Questions connexes