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

#sql-server #sql-server-ce #identity #sql-server-ce-4

#sql-сервер #sql-server-ce #идентификатор #sql-server-ce-4

Вопрос:

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

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

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

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

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

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

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

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

Комментарии:

1. Что вы подразумеваете под «похоже, не работает» [так в оригинале]? Что происходит? Вы получаете какое-либо сообщение об ошибке?

Ответ №1:

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

Комментарии:

1. Удивлен, если ошибка doc может повторяться по крайней мере 3 раза для SQLCE 3.5 SP1 , 3.5 SP2 и 4.0 ? Я действительно запутался.

Ответ №2:

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

 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;
  

Комментарии:

1. Вы уверены в этом? Я использую DbCommand. Выполняется функция Scalar(), и она возвращает идентификатор новой записи в порядке. Это просто должна быть отдельная команда, а не пакетная.

2. Компактное редактирование SQL Server поддерживает только один оператор для каждой команды. Ссылка

3. Кроме того, кажется, что вы ДОЛЖНЫ «ВЫБРАТЬ @@IDENTITY» для того же открытого соединения, которое вы запустили «INSERT».

Ответ №3:

После множества ошибок с 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;
}