来自数据库的系统格式异常?

时间:2015-08-25 13:47:54

标签: c# sql sql-server

我有以下代码:

    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()

3 个答案:

答案 0 :(得分:3)

SELECT SCOPE_IDENTITY()

当一个新行被INSERTED时获取自动生成的Id,在你的情况下它是一个更新所以它可能返回null,你应该使用

select CAST(@@rowcount as int)

代替

答案 1 :(得分:1)

正如我在评论中所说:

  

您正在根据非主键进行更新,因此可以更多   1更新的行。你想要哪一个结果?你在找   我认为OUTPUT条款。

所以解决方案是在OUTPUT语句的情况下对InsertedDeleted虚拟表使用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);