2009-11-05 3 views
0

Когда я запускаю это как свою первую оценку, я получаю исключение near "last_insert_rowid". Это относится к последнему last_insert_rowid() ;. Если я установил курсор в строку command.CommandText = и запустил его снова, это нормально.Странный результат с

Что дает? Кажется, что last_insert_rowid работает правильно, почему не работает last_insert_rowid после второй вставки.

Я попытался переместить last_insert_rowid() после выполнения, и я все еще получаю сообщение об ошибке. Что дает?

 using (var trans = connection.BeginTransaction()) 
     { 
      command.CommandText = 
       "INSERT INTO link_list(link, status, hash_type, hash_id) " + 
       "VALUES(@link, @status, @hash_type, @hash_id);" + 
       "INSERT INTO active_dl(linkId, orderNo) " + 
       "VALUES(last_insert_rowid(), (SELECT COUNT(*) FROM active_dl)); last_insert_rowid();"; 
      command.Parameters.Add("@link", System.Data.DbType.String).Value = link; 
      command.Parameters.Add("@status", System.Data.DbType.Int32).Value = SiteBase.Status.none; 
      command.Parameters.Add("@hash_type", System.Data.DbType.Int32).Value = 0; 
      command.Parameters.Add("@hash_id", System.Data.DbType.Int32).Value = 0; 
      int rowid = command.ExecuteNonQuery(); 
      trans.Commit(); 
     } 
+0

Название вопроса не имеет специфики: «Странный результат с» что? – ndim

+1

В качестве побочного примечания, не ExecuteNonQuery возвращает количество затронутых строк? Если вы хотите вернуть последний вставленный id, вам нужно было бы использовать ExecuteScalar, я бы подумал. – Glenn

+0

Caelum: Ой. Синтаксическая ошибка ослепила меня. Это еще одна ошибка, которая заставит меня врасплох. Спасибо. – 2009-11-05 02:04:34

ответ

1

Почему последний last_insert_rowid() есть? После второй вставки вы вызываете last_insert_rowid без выбора или чего-либо, чтобы определить, что вы хотите с ним сделать.

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

+0

класть выбор передняя работа. Интересно, почему он не дал мне ошибку, когда я переместил точку останова и запустил ее во второй раз (это непоследовательно) – 2009-11-05 00:33:04

0

Вы пытаетесь выполнить 2 команды sql в одном утверждении. Вам нужно разбить 2 оператора на 2 вызова и вернуть вставленный идентификатор из первого оператора.

Альтернативное предложение - это хранимая процедура, но я не думаю, что sqlite поддерживает их.

Смежные вопросы