7

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

我有一个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);       
}
4

7 回答 7

9

尝试这个:

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 类添加一个新方法。

查看我们可以停止使用 AddWithValue() 了吗?并停止使用.AddWithValue()- 它可能会导致意想不到和令人惊讶的结果......

于 2015-02-20T11:09:48.457 回答
3

给定您正在使用的 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);
于 2015-02-20T11:26:53.390 回答
0

可能是这种情况,因为这适用于 SQL SERVER 2000

  • 2005 年以上使用

    OUTPUT INSERTED.ID

喜欢

INSERT INTO Roles(UserId)
OUTPUT INSERTED.ID
VALUES(@UserId)
于 2015-02-20T10:51:46.770 回答
0

您不需要输出变量来执行此操作。您可以只使用 aSELECT SCOPE_IDENTITY()获取插入数据库的最后一个 id 并使用ExecuteScalar()方法 from 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();
}

我不知道objDataobject 确实如此,但看看你是如何执行你的命令的。

于 2015-02-20T10:53:53.780 回答
0

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

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

我建议你把它放到一个存储过程中并使用 调用它ExecuteScalar,这将返回最后一个选择的值。

于 2015-02-20T11:17:43.327 回答
0

检查 SCOPE_IDENTITY()..

https://msdn.microsoft.com/en-IN/library/ms190315.asp

于 2015-02-20T11:29:30.663 回答
0

如果您使用的是 CommandText,则不应忘记在 CommandText 行的末尾添加“SELECT SCOPE_IDENTITY()” 。

于 2020-03-25T23:31:53.987 回答