2009-11-03 68 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