代码之家  ›  专栏  ›  技术社区  ›  Henrik S

使用SQL Server插入C#后返回id

  •  7
  • Henrik S  · 技术社区  · 10 年前

    我知道这个问题已经在这个网站上出现过很多次了,但我无法让我的代码正常工作。

    我有一个 Insert 语句,我需要asp.net页面上该语句的id。

    我得到了 return value 0 .

    public int newid { get; set; }
    
    public void CreateAlbum(string _titel, string _name, string _thumb, int _userid)
    {
        objCMD = new SqlCommand(@"INSERT INTO tblFotoalbum 
                                      (fldAlbumHead, fldAlbumName, fldAlbumThumb, fldUserID_FK)
                                  VALUES 
                                      (@titel, @name, @thumb, @userid);
    
                                  SET @newid = SCOPE_IDENTITY()");
    
        objCMD.Parameters.AddWithValue("@titel", _titel);
        objCMD.Parameters.AddWithValue("@name", _name);
        objCMD.Parameters.AddWithValue("@thumb", _thumb);
        objCMD.Parameters.AddWithValue("@userid", _userid);
        objCMD.Parameters.AddWithValue("@newid", newid);
    
        objData.ModifyData(objCMD);       
    }
    
    7 回复  |  直到 10 年前
        1
  •  10
  •   marc_s    10 年前

    试试看:

    public int CreateAlbum(string _titel, string _name, string _thumb, int _userid)
    {
        // define return value - newly inserted ID
        int returnValue = -1;
    
        // define query to be executed
        string query = @"INSERT INTO tblFotoalbum (fldAlbumHead, fldAlbumName, fldAlbumThumb, fldUserID_FK)
                                  VALUES (@titel, @name, @thumb, @userid);
                         SELECT SCOPE_IDENTITY();"
    
        // set up SqlCommand in a using block   
        using (objCMD = new SqlCommand(query, connection)) 
        {
            // add parameters using regular ".Add()" method 
            objCMD.Parameters.Add("@titel", SqlDbType.VarChar, 50).Value = _titel;
            objCMD.Parameters.Add("@name", SqlDbType.VarChar, 100).Value = _name;
            objCMD.Parameters.Add("@thumb", SqlDbType.VarChar, 100).Value = _thumb;
            objCMD.Parameters.Add("@userid", SqlDbType.VarChar, 25).Value = _userid;
    
            // open connection, execute query, close connection
            connection.Open();
            object returnObj = objCMD.ExecuteScalar();
    
            if(returnObj != null)
            {
               int.TryParse(returnObj.ToString(), out returnValue);
            }
    
            connection.Close();
        }
    
        // return newly inserted ID
        return returnValue;
    }
    

    不确定如何将其与您的 objData 类-也许您需要为此向DAL类添加一个新方法。

    退房 Can we stop using AddWithValue() already? 并停止使用 .AddWithValue() -它会导致意想不到的结果。。。

        2
  •  3
  •   Jesús López Sean Lange    10 年前

    给定您正在使用的sql语句,您需要配置 @newid 作为输出参数:

    var newIdParam = objCMD.Parameters.Add("@newid", SqlDbType.Int32)
    newIdParam.Direction = ParameterDirection.OutPut;
    

    然后使用ExecuteNonQuery执行命令,然后可以读取ouptut参数:

    objCmd.ExecuteNonQuery();
    int newId = Convert.ToInt32(newIdParam.Value);
    

    编辑: 我猜ModifyData方法设置了连接属性并调用ExecuteNonQuery,所以您的代码应该是:

    objData.ModifyData(objCMD);      
    int newId = Convert.ToInt32(newIdParam.Value);
    
        3
  •  1
  •   Tushar Gupta    10 年前

    这可能适用于SQL SERVER 2000

    • 2005年以上使用

      OUTPUT INSERTED.ID

    喜欢

    INSERT INTO Roles(UserId)
    OUTPUT INSERTED.ID
    VALUES(@UserId)
    
        4
  •  1
  •   Hakan Lekesiz    4 年前

    如果您正在使用CommandText,您不应该忘记添加 “选择SCOPE_IDENTITY()” CommandText行的结尾。

        5
  •  0
  •   Felipe Oriani    10 年前

    你不需要一个输出变量 SELECT SCOPE_IDENTITY() 要获取插入到数据库中的最后一个id,请使用 ExecuteScalar() 方法来自 DbCommand .

    public int newid { get; set; }
    
    public void CreateAlbum(string _titel, string _name, string _thumb, int _userid)
    {
        objCMD = new SqlCommand(@"INSERT INTO tblFotoalbum 
                               (fldAlbumHead, fldAlbumName, fldAlbumThumb, fldUserID_FK)
                               VALUES 
                               (@titel, @name, @thumb, @userid);
    
                               SELECT SCOPE_IDENTITY()");
    
        objCMD.Parameters.AddWithValue("@titel", _titel);
        objCMD.Parameters.AddWithValue("@name", _name);
        objCMD.Parameters.AddWithValue("@thumb", _thumb);
        objCMD.Parameters.AddWithValue("@userid", _userid);
        objCMD.Parameters.AddWithValue("@newid", newid);
    
        objData.ModifyData(objCMD);     
    
    
        newid = (int)objCMD.ExecuteScalar();
    }
    

    我不知道 objData 对象,但请查看如何执行命令。

        6
  •  0
  •   Thorsten Dittmar    10 年前

    首选解决方案(AFAIK也是唯一真正安全的解决方案)是使用 OUTPUT 子句,如本例所示:

    DECLARE @newIdTable(newid INT);
    INSERT INTO table(...) OUTPUT INSERTED.ID INTO @newIdTable VALUES (...);
    SELECT TOP 1 newid FROM @newIdTable;
    

    我建议您将其放入存储过程中,并使用 ExecuteScalar ,这将返回上次选择的值。

        7
  •  0
  •   Viral Sarvaiya    10 年前