为什么在执行insert语句后,此命令会获得@@ Identity?

时间:2011-08-08 20:21:00

标签: tsql sql-server-ce

只是尝试执行插入然后获取@@ 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编辑器上执行此操作时(当我在行中执行两个命令时)。

希望有人能帮忙......

(btw commandArg作为参数传入)

更新:

我原来的帖子不对,但我已经改变了,但仍然得到错误。希望有人可以帮忙!

更新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 个答案:

答案 0 :(得分:2)

我一直在单独的查询中使用@@ identity。重要的是它是在同一个连接上。如前所述,您没有执行“SELECT @@ Identity;”。您将值设置为commandArg.CommandText = Sql;在ExecuteScalar之前。使用retInt = commandArg.ExecuteNonQuery();并查看retInt是否为1.将其置于try catch finally块中,即可读取异常消息。有意义的是,你在最后一行得到一个null,因为insert不是Scalar命令。

答案 1 :(得分:1)

听起来你正试图获取最近插入的项目的标识列。

鉴于:

  • 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

答案 2 :(得分:-1)

将SELECT @@ IDENTITY文本放在insertSql字符串的末尾。 @@ IDENTITY仅在插入后直接起作用。它不能在不同的查询中。