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



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

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

试试这个:

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()-它可能会导致意想不到的结果。。。

给定您正在使用的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);

这可能适用于SQL SERVER 2000

  • 2005年以后使用

    OUTPUT INSERTED.ID

INSERT INTO Roles(UserId)
OUTPUT INSERTED.ID
VALUES(@UserId)

如果您正在使用CommandText,您不应该忘记在CommandText行的末尾添加"SELECT SCOPE_IDENITY()"

您不需要输出变量。只需使用SELECT SCOPE_IDENTITY()获取插入数据库的最后一个id,然后使用DbCommand中的ExecuteScalar()方法即可。

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对象是这样做的,但请看看您是如何执行命令的。

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

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

我建议您将其放入一个存储过程中,并使用ExecuteScalar调用它,它将返回最后一次选择的值。

使用SCOPE_IDENITY()进行检查。。

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

相关内容

  • 没有找到相关文章

最新更新