#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;
}