2014-09-28 72 views
0

是否可以在查詢中創建一個SQL select max(id)作爲變量?ADO.NET SQL命令參數是否可以包含子查詢?

這不起作用:

command.CommandText = "INSERT INTO ordreid (ordrenr,ordreid) SELECT @ordrenr, @ordreid"; 
command.Parameters.AddWithValue("@ordrenr", nyordre); 
command.Parameters.AddWithValue("@ordreid", ("MAX(ordreid)+1 FROM ordreid")); 
command.ExecuteScalar(); 

這裏是想我做的一張照片。 5位顧客已將訂單添加到訂單中。客戶1有3件商品,客戶2有4件商品,客戶3有1件商品,依此類推...

這樣我即使通過訂單也可以有30件商品,因此我有1 ordreid

enter image description here

+0

爲什麼不使用'IDENTITY'列? – 2014-09-28 19:59:01

+0

「標識」列增加了標識。我想讓那個特定的表有2個colums(ordreid,ordrenr)。 Ordrenr應該在添加項目時增加,但是如果用戶創建一個全新的項目列表,則只能增加ordreid。 – user3888775 2014-09-28 20:10:40

回答

2

查詢參數不能包括SQL一字不差。

這就是這樣準備的語句如何防止SQL Injection因爲它們是而不是直接插入。在查詢中只使用相應的數據 - 在這種情況下,字符串包含SQL,並導致無效的SQL語法。

然後SQL文本需要看起來類似於以下內容,雖然這可能是而不是做所需。 (詢問如何做更高級別的任務會導致實際有用的查詢/方法。)

@"INSERT INTO ordreid (ordrenr, ordreid) 
    SELECT @ordrenr, MAX(ordreid)+1 
    FROM ordreid" 
1

command.Parameters.AddWithValue("@ordreid", ("MAX(ordreid)+1 FROM ordreid"));

方法名的原因AddWithValue提示,爲什麼這不會工作:參數包含數據,即:值。它們不能代表SQL語句的一部分。

您的意圖似乎是@ordreid應該替換爲那條SQL。如果是這樣,那麼沒有理由甚至沒有參數。簡單地手動執行替換和更改CommandText:(從兩行,鋪展命令文本,爲了便於閱讀起見使用C#的@"…"字符串語法開)

command.CommandText = @"INSERT INTO ordreid (ordrenr, ordreid) 
         VALUES (@ordrenr, (SELECT MAX(ordreid)+1 FROM ordreid));"; 

注意,我改變四件事情。只有前兩點是至關重要的:

  1. 我直接移動MAX(…) SQL插入CommandText。這使(無效)@ordreid參數過時。

  2. 要確定MAX(ordreid) FROM ordreid的值,您需要一個子查詢;因此在MAX之前增加了SELECT。否則,語法將無效。

  3. 我將其替換爲您的SELECTVALUES table value constructor。(否則,由於前一點,我們會有兩個SELECT s彼此非常接近,這看起來有點令人困惑。)

  4. 我在查詢結尾處添加了;。當前版本的SQL Server不需要這樣的語句終結器,但是微軟已經暗示他們可能在未來的T-SQL版本中成爲強制性的。因此,我認爲現在進入是個好習慣。

這一切都這樣說,你應該打開ordreid列到IDENTITY列,讓SQL Server的選擇要插入的值(使SELECT MAX(…)業務過時)。否則,如果兩個進程或線程同時執行相同的INSERT命令,則最終可能會有多行具有相同值的ordreid

相關問題