2009-11-03 112 views
0

我有一个carsale项目。它完全在本地主机上工作。我有一个“AddCar.aspx”页面,用于插入带汽车功能的汽车记录。汽车功能通过复选框进行选择。如果我不检查任何复选框,则没有问题。但是,如果我检查功能复选框之一,我的网页给出了这样的错误:“子查询在此背景下 只允许标量表达式是 允许的。”在SQL Server 2005的插入语句中使用子查询

而且我的代码是这样的:

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++; 
     } 
} 

有没有什么解决办法吗?

回答

5

更改SQL这样的:

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

通过11秒打我:-) – brendan 2009-11-03 17:13:37

2

我觉得你可以只是重新格式化你的SQL和这样来做:

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

两件事情,首先,试试这个SQL :

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

其次,Max(RecId)是有问题的,如果你有多个线程这样做。你知道你可以得到最后插入的身份吗?这不是你想在这里做什么?如果您刚刚插入一条记录到record表在上一步

select SCOPE_IDENTITY() as RecID; 

会给你一个线程安全的方式正确RecID

+0

从不使用@@标识来执行此操作,而是使用scope_identity。有人在桌子上放置触发器时,@@身份将给出错误的答案。为了这个目的,使用@@标识是非常糟糕的做法。 – HLGEM 2009-11-03 18:01:18

+0

@HLGEM:很好的建议。我更新了我的答案以使用SCOPE_IDENTITY()。 – Asaph 2009-11-03 18:20:45

0

这很可能是由于并发控制。我建议SQL Server 2005上这样做的一种方法是你的SQL语句更改为以下使用的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问题与并发无关,CTE对解决方案没有任何帮助。不知道为什么这个投票了。 – Andomar 2009-11-03 23:53:15

0

朋友,你都回答正确,非常感谢。 我改变了我的代码,这样,它的工作:

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

但我不知道如何设置接受的答案,因为所有的答案都是真实的:)

+0

当几个答案一样好时,人们通常会将最快的答案标记为已接受 – Andomar 2009-11-03 23:56:11

+0

@Mehmet Kaleli:要将答案标记为已接受,请单击您要接受的答案旁边的复选框。 – Asaph 2009-11-04 05:05:50