Почему эта команда получает @@ Identity после выполнения оператора вставки? - PullRequest
0 голосов
/ 09 августа 2011

Просто пытаюсь выполнить вставку и затем получить @@ Identity, но это оказывается немного сложным.

Итак, у меня есть следующая Sql:

    int retInt = 0;

    string Sql = insertSql;

    Connection.Open();

    commandArg.CommandText = insertSql;

    commandArg.Connection = Connection;

    commandArg.ExecuteNonQuery();

    commandArg.CommandText = "SELECT @@Identity;";

    commandArg.CommandText = Sql;

    retInt = (int)commandArg.ExecuteScalar();

    return retInt;

Но когда я в конце получаю команду ExecuteScalar, я получаю исключение нулевой ссылки. Я делаю что-то не так с csharp? Потому что, когда я делаю это в редакторе Sql, он работает (когда я выполняю обе команды в строке).

Надеюсь, кто-то может помочь ....

(кстати, в качестве параметра передается commandArg)

UPDATE:

мой оригинальный пост был неверным, но я изменился и все еще получаю сообщение об ошибке. Надеюсь, кто-то может помочь!

ОБНОВЛЕНИЕ 2:

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

SqlCeConnection myConnection = new SqlCeConnection(@"Data Source=C:\database.sdf");
            SqlCeCommand myCommand = new SqlCeCommand();
            myCommand.Connection = myConnection;

            myConnection.Open();

            myCommand.CommandText = "Insert into tbl_media (dateadded) values (getdate())";
            SqlCeDataReader insertReader =  myCommand.ExecuteReader();

            myCommand.CommandText = "select @@identity";
            SqlCeDataReader identityReader = myCommand.ExecuteReader();

            myConnection.Close();

Ответы [ 3 ]

2 голосов
/ 09 августа 2011

Я все время использую @@ identity в отдельном запросе.Все, что имеет значение, это то, что он находится на одной и той же связи.Как указано выше, вы НЕ выполняете "SELECT @@ Identity;".Вы устанавливаете значение в commandArg.CommandText = Sql;перед вами ExecuteScalar.Используйте retInt = commandArg.ExecuteNonQuery ();и посмотрите, если retInt = 1. Поместите это в блок try catch, чтобы вы могли прочитать сообщение об исключенииИмеет смысл получить нулевое значение в последней строке, так как вставка не является скалярной командой.

1 голос
/ 09 августа 2011

Звучит так, будто вы пытаетесь получить столбец идентификаторов для недавно вставленного элемента.

Учитывая, что:

  • SQL CE будет позволять вам выполнять только один оператор на команду
  • IDENTITY выходит за рамки
  • вы не можете использовать сохраненные процедуры

Вы можете выполнить вставку, а затем запросить последнюю запись, которая соответствует вставленной записи:

 SELECT TOP 1 ID FROM MyTable
  WHERE Name = @CustomerName
 /* AND all your other matching criteria for the entity from your INSERT */
 ORDER BY CreateDate DESC
0 голосов
/ 09 августа 2011

Поместите текст SELECT @@ IDENTITY в конец строки insertSql.@@ IDENTITY работает только после вставки.Это не может быть в другом запросе.

...