Вставка строки и получение идентификатора новой строки в SQL Server CE

Я пытаюсь вставить строку и вернуть идентификатор новой строки примерно так:

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

Я пытаюсь выполнить оба оператора одним вызовом объекта DbCommand в C#... это не работает или у меня что-то не так.

Я читал, что Compact Edition не поддерживает выполнение нескольких операторов в пакете... но я также нашел это:

Если вы хотите выполнять несколько запросов одновременно, вы должны включать символ новой строки для каждого оператора и точку с запятой в конце каждого оператора.

Источник: http://technet.microsoft.com/en-us/library/bb896140(SQL.110).aspx

Так это работает или нет... и если да, то что мне не хватает?

(Я понимаю, что могу выполнить две команды, и это отлично работает, но мне интересно, не упустил ли я что-то).


person Brad Robinson    schedule 06.04.2011    source источник
comment
Что вы имеете в виду под не похоже на работу [так в оригинале]? Что случается? Вы получаете сообщение об ошибке?   -  person Guffa    schedule 06.04.2011


Ответы (3)


Это похоже на ошибку документа, это наоборот. Вы можете выполнить только один оператор для каждого вызова ExecuteNonQuery.

person ErikEJ    schedule 06.04.2011
comment
Удивлен, если ошибка документа может повторяться не менее 3 раз для SQLCE 3.5 SP1, 3.5 SP2 и 4.0? Я действительно запутался. - person Masood Khaari; 20.11.2013

Вы должны определить выходной параметр, чтобы получить значение идентификатора

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;
person mariocase84    schedule 06.04.2011
comment
Вы уверены, что? Я использую DbCommand.ExecuteScalar(), и он отлично возвращает новые записи. Это просто должна быть отдельная команда, а не пакетная. - person Brad Robinson; 06.04.2011
comment
SQL Server Compact Edition поддерживает только один оператор на команду. ссылка - person mariocase84; 06.04.2011
comment
Кроме того, кажется, что вы ДОЛЖНЫ ВЫБРАТЬ @@IDENTITY для того же открытого соединения, которое вы запустили INSERT. - person Agent007; 12.12.2013

После множества ошибок с sql-server-ce, таких как Direction не может быть Output, я заставил это работать.

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;
}
person hultqvist    schedule 10.10.2016