2011-04-06 138 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; 
}