2016-11-14 13 views
1

Моя программа имеет режим онлайн и офлайн.Выберите SCOPE_IDENTITY после вставки с помощью SqlCeCommand

  • В настоящее время он подключается к экземпляру SQL Server с использованием классов C# SqlCommand.
  • Оффлайн он подключается к локальному .SDF файлам с использованием классов C# SqlCeCommand.

Теперь я хочу сделать следующее, который работает, когда в режиме онлайн

GetSqlCommand("insert into my_table (col1) values (@c1); SELECT SCOPE_IDENTITY()", conn)) 

Так я вставить запись вернуть идентификатор этой новой записи с SELECT SCOPE_IDENTITY().

Но в автономном режиме с использованием SQL Server CE он выдает ошибку. Есть ли способ вернуть ID из вставки с SQL Server CE без запуска отдельного запроса?

ответ

1

SQL Server CE не поддерживает несколько запросов в одной команде, попробуйте, как показано ниже

SqlCeCommand cmd = new SqlCeCommand("insert into my_table (col1) values (@c1)", conn); 
//set paremeter values 
//execute insert 
cmd.ExecuteNonQuery(); 
//now change the sql statment to take identity 
cmd.CommandText = "SELECT @@IDENTITY"; 
int id = Convert.ToInt32(cmd.ExecuteScalar()); 

https://stackoverflow.com/a/6480017/2558060

0

Хотя Damith ответ правильный, Да, мы не можем запустить несколько запросов с SQL Server CE.

Я беру пример с тем же кодом.

SqlCeCommand cmd = new SqlCeCommand("insert into my_table (col1) values (@c1)", conn); 
    //set paremeter values 
    //execute insert 
    cmd.ExecuteNonQuery(); 
    //now change the sql statment to take identity 
    ////////////////**CONNECTION SHOULD NOT BE CLOSED BETWEEN TWO COMMANDS**///// 
    cmd.CommandText = "SELECT @@IDENTITY"; 
    int id = Convert.ToInt32(cmd.ExecuteScalar()); 

Примечание: соединение должно быть открыто между двумя командами, иначе второй запрос не будет выполнен.

Лучше использовать этот код в транзакции.

Примечание: объекты SQL Server CE не являются потокобезопасными, это может привести к исключению нарушения доступа, если экземпляр SqlCeConnection или SqlCeTransaction разделяется между потоками. Рекомендуется, чтобы каждый поток использовал отдельное соединение, он не должен использоваться для нескольких потоков.

0

Я думаю, что это ваш ответ: How do I use an INSERT statement's OUTPUT clause to get the identity value?, но я не уверен о SQL CE. Попробуйте.

EDIT: Тогда этот ответ, вероятно, прав: Inserting into SQL Server CE database file and return inserted id

+0

Хорошая идея. Но, к сожалению, CE не поддерживает это: https://technet.microsoft.com/en-us/library/ms174633(v=sql.110).aspx –