我有以下代码:
string updatestr= "UPDATE t1 SET c3= @v3,c4=@v4,c5=@v5,c6=@v6 WHERE c2 = 'test' SELECT SCOPE_IDENTITY()";
SqlCommand updatecmd= new SqlCommand(updatestr, conn);
updatecmd.Parameters.AddWithValue("@v3",value3)
updatecmd.Parameters.AddWithValue("@v4",value3)
updatecmd.Parameters.AddWithValue("@v5",value3)
updatecmd.Parameters.AddWithValue("@v6",value3)
object ind = updatecmd.ExecuteScalar();
int distindex = int.Parse(ind.ToString());
现在我希望范围标识的输出是一个int(即29)但是我得到一个格式异常。在int.Parse(ind.ToString());.我打印了ind.tostring的值,并出于某种原因进行了测试。请注意,数据库的第一个列和primairy键(称为id)是一个自动增量int,我希望选择它。我究竟做错了什么?
哦,这是查询的更好的格式化版本:
UPDATE t1
SET c3= @v3,c4=@v4,c5=@v5,c6=@v6
WHERE c2 = "test"
SELECT SCOPE_IDENTITY()
答案 0 :(得分:3)
SELECT SCOPE_IDENTITY()
当一个新行被INSERTED时获取自动生成的Id,在你的情况下它是一个更新所以它可能返回null,你应该使用
select CAST(@@rowcount as int)
代替
答案 1 :(得分:1)
正如我在评论中所说:
您正在根据非主键进行更新,因此可以更多 1更新的行。你想要哪一个结果?你在找 我认为
OUTPUT
条款。
所以解决方案是在OUTPUT
语句的情况下对Inserted
或Deleted
虚拟表使用update
子句:
string updatestr= "UPDATE t1 SET c3= @v3,c4=@v4,c5=@v5,c6=@v6
OUTPUT Inserted.id
WHERE c2 = 'test'";
答案 2 :(得分:0)
试试这个:
int distindex = 0;
object ind = updatecmd.ExecuteScalar();
if(ind != null)
int.TryParse(ind.ToString(), out distindex);