2015-04-07 3 views
1

Я пытаюсь вставить данные в две таблицы в одном запросе. вторая таблица требует значения scope_identity() из первого.SQL Server CE не распознает DECLARE, BEGIN, COMMIT

Мой запроса:

String query = "DECLARE @questionID int; 
      INSERT INTO question (questionText) VALUES(@question);SELECT @questionID = scope_identity(); 
      INSERT INTO topic_question(toppicID,questionID) VALUES(@topic,@questionID);"; 

Исполнительный как:

SqlCeCommand commandInsert = new SqlCeCommand(query, connection); 
commandInsert.Parameters.AddWithValue("@question", question); 
commandInsert.ExecuteScalar(); 

получил сообщение об ошибке:

Была ошибку разбора номера query.Token Line = 1 , Смещение линии токена = 1, токен в ошибке = DECLARE. ..........

Я попытался с помощью BEGIN TRANSACTION в начале запроса и COMMIT наконец запроса. Но все еще ошибка остается. Кто-нибудь может заметить, что я делаю неправильно?

+0

SQL CE имеет сокращенный набор команд; мне не было бы приятно слышать, что это не поддерживается: https://msdn.microsoft.com/en-us/library/ms173372.aspx –

ответ

1

Вы не можете объявлять переменные в SQL Server CE и разрешен только один оператор для каждой команды.

Таким образом, вы должны разделить ваше заявление и выполнить его один за другим, как:

SqlCeCommand cmd = new SqlCeCommand("INSERT INTO question (questionText) VALUES(@question)", connection); 
cmd.Parameters.AddWithValue("@question", question); 
cmd.ExecuteNonQuery(); 

cmd.CommandText = "select @@IDENTITY"; 
cmd.Parameters.Clear(); 
var id = cmd.ExecuteScalar(); 

cmd.CommandText = "INSERT INTO topic_question(toppicID,questionID) VALUES(@topic,@questionID);" 
cmd.Parameters.Clear(); 
cmd.Parameters.AddWithValue("@topic",.....); 
cmd.Parameters.AddWithValue("@questionID", id); 
cmd.ExecuteNonQuery(); 

Примечание вы должны держать соединение открытым (не закрывайте его) после первого вызова cmd.ExecuteNonQuery(); для того, чтобы select @@identity работать.

+0

Отличный ответ Энди. Не знал, что у CE нет этой функции. – Shasi