Return 使用 SQL 服务器插入 C# 后的 ID
Return id after insert C# using SQL Server
我知道这个问题已经多次出现在这个网站上,但我的代码无法正常工作。
我有一个 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);
}
这可能适用于 SQL SERVER 2000
2005 年以后使用
OUTPUT INSERTED.ID
喜欢
INSERT INTO Roles(UserId)
OUTPUT INSERTED.ID
VALUES(@UserId)
您不需要输出变量来执行此操作。您可以只使用 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
object 有没有,但是看看你是如何执行你的命令的。
试试这个:
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
class 集成 - 也许您需要为此向该 DAL class 添加一个新方法。
查看 Can we stop using AddWithValue() already? 并停止使用 .AddWithValue()
- 它可能会导致意外和令人惊讶的结果...
首选解决方案(AFAIK 也是唯一真正安全的解决方案)是使用 OUTPUT
子句,如本例所示:
DECLARE @newIdTable(newid INT);
INSERT INTO table(...) OUTPUT INSERTED.ID INTO @newIdTable VALUES (...);
SELECT TOP 1 newid FROM @newIdTable;
我建议你将它放入一个存储过程中并使用 ExecuteScalar
调用它,这将 return 最后一个 select.
的值
鉴于您正在使用的 sql 语句,您需要将 @newid
配置为输出参数:
var newIdParam = objCMD.Parameters.Add("@newid", SqlDbType.Int32)
newIdParam.Direction = ParameterDirection.OutPut;
然后使用ExecuteNonQuery执行命令,之后就可以读取输出参数了:
objCmd.ExecuteNonQuery();
int newId = Convert.ToInt32(newIdParam.Value);
编辑:
我想 ModifyData 方法设置连接 属性 并调用 ExecuteNonQuery,所以您的代码将是:
objData.ModifyData(objCMD);
int newId = Convert.ToInt32(newIdParam.Value);
检查 SCOPE_IDENTITY()..
如果您正在使用 CommandText,您不应该忘记在 CommandText 行的末尾添加 "SELECT SCOPE_IDENTITY()"。
我知道这个问题已经多次出现在这个网站上,但我的代码无法正常工作。
我有一个 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);
}
这可能适用于 SQL SERVER 2000
2005 年以后使用
OUTPUT INSERTED.ID
喜欢
INSERT INTO Roles(UserId)
OUTPUT INSERTED.ID
VALUES(@UserId)
您不需要输出变量来执行此操作。您可以只使用 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
object 有没有,但是看看你是如何执行你的命令的。
试试这个:
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
class 集成 - 也许您需要为此向该 DAL class 添加一个新方法。
查看 Can we stop using AddWithValue() already? 并停止使用 .AddWithValue()
- 它可能会导致意外和令人惊讶的结果...
首选解决方案(AFAIK 也是唯一真正安全的解决方案)是使用 OUTPUT
子句,如本例所示:
DECLARE @newIdTable(newid INT);
INSERT INTO table(...) OUTPUT INSERTED.ID INTO @newIdTable VALUES (...);
SELECT TOP 1 newid FROM @newIdTable;
我建议你将它放入一个存储过程中并使用 ExecuteScalar
调用它,这将 return 最后一个 select.
鉴于您正在使用的 sql 语句,您需要将 @newid
配置为输出参数:
var newIdParam = objCMD.Parameters.Add("@newid", SqlDbType.Int32)
newIdParam.Direction = ParameterDirection.OutPut;
然后使用ExecuteNonQuery执行命令,之后就可以读取输出参数了:
objCmd.ExecuteNonQuery();
int newId = Convert.ToInt32(newIdParam.Value);
编辑: 我想 ModifyData 方法设置连接 属性 并调用 ExecuteNonQuery,所以您的代码将是:
objData.ModifyData(objCMD);
int newId = Convert.ToInt32(newIdParam.Value);
检查 SCOPE_IDENTITY()..
如果您正在使用 CommandText,您不应该忘记在 CommandText 行的末尾添加 "SELECT SCOPE_IDENTITY()"。