2011-04-06 189 views
8

我想插入一行,並取回新行的身份像這樣的東西檢索新行的身份:插入行和SQL Server CE

INSERT INTO blah....; 
SELECT @@IDENTITY as NewID; 

我試圖同時執行在C#中調用一個DbCommand對象的語句...它似乎不工作,或者我有錯誤。

我讀過的精簡版不支持在批處理中執行多個語句......但我也發現了這一點:

如果你想同時運行多個查詢,則必須包括一個新的每個語句的行字符和每個語句結尾的分號。

來源:http://technet.microsoft.com/en-us/library/bb896140(SQL.110).aspx

所以它的工作原理或不...如果是的話我缺少什麼?

(我知道我可以執行兩個命令,並且工作正常,但我不知道是否我錯過了一些東西)。

+1

你是什麼意思的「似乎並不工作」[原文如此?怎麼了?你有任何錯誤信息? – Guffa 2011-04-06 06:46:50

回答

8

這看起來像一個文檔錯誤,它是相反的。每個ExecuteNonQuery調用只能執行一條語句。

+1

如果對於SQLCE [3.5 SP1](http://technet.microsoft.com/en-us/library/bb896140(SQL.100).aspx),[3.5 SP2]文檔錯誤可以重複至少3次感到驚訝, (http://technet.microsoft.com/en-us/library/bb896140(SQL.105).aspx)和[4.0](http://technet.microsoft.com/en-us/library/bb896140( SQL.110)的.aspx)?我真的很困惑。 – 2013-11-20 11:22:21

3

你必須定義一個輸出參數來獲取標識值

sqlCommand Command = Conn.CreateCommand(); 
Command.CommandText = "insert into MyTable(Value1,Value2) values(MyValue,MyValue)" 
Command.ExecuteNonQuery(); 
Command.CommandText = "select @ID = @@IDENTITY" 
SqlParameter ID = new SqlParameter("@ID", SqlDbType.Int); 
ID.Direction = ParameterDirection.Output; 
Command.Parameters.Add(ID); 
Command.ExecuteNonQuery(); 
int NewID = (int)ID.Value; 
+0

你確定嗎?我正在使用DbCommand.ExecuteScalar(),它返回新的記錄身份正常。它只需要一個單獨的命令,而不是一個批處理命令。 – 2011-04-06 11:43:32

+2

SQL Server Compact Edtion每條命令只支持一條語句。 [鏈接](http://social.msdn.microsoft.com/Forums/en-US/sqlce/thread/1d1d3267-dc29-470b-bb20-00487a39bc87/) – mariocase84 2011-04-06 13:41:33

+1

此外,它似乎你必須「SELECT @@ IDENTITY 「針對您已經運行」INSERT「的同一個開放連接。 – Agent007 2013-12-12 08:32:31

0

很多錯誤後與sql-server-ce如方向不能輸出我得到了這個工作。

public static long GetIdentity(this IDbConnection connection) 
{ 
    var cmd = connection.CreateCommand(); 
    cmd.CommandText = "SELECT @@IDENTITY"; 
    cmd.CommandType = CommandType.Text; 
    var id = cmd.ExecuteScalar(); 
    return (long)(decimal)id; 
}