检索scope_identity时,指定的强制转换无效

时间:2010-06-12 06:34:48

标签: c# asp.net sql ado.net

我遇到异常:“指定演员表无效”,这是代码

con.Open();
string insertQuery = @"Insert into Tender (Name, Name1, Name2) values ('Val1','Val2','Val3');Select Scope_Identity();";

SqlCommand cmd = new SqlCommand(insertQuery, con);
cmd.ExecuteNonQuery();
tenderId = (int)cmd.ExecuteScalar();

4 个答案:

答案 0 :(得分:22)

为了完整性,您的代码示例存在三个问题。

1)您正在通过调用ExecuteNonQueryExecuteScalar两次执行查询。因此,每次运行此函数时,您将在表中插入两条记录。您的SQL虽然是两个不同的语句,但它们将一起运行,因此您只需要调用ExecuteScalar

2)Scope_Identity() returns a decimal。您可以对查询结果使用Convert.ToInt32,也可以将返回值转换为decimal,然后转换为int。

3)确保将您的连接和命令对象包装在using语句中,以便正确处理它们。

using (SqlConnection connection = new SqlConnection(connectionString))
{
    using (SqlCommand command = new SqlCommand(sql, connection))
    {
        connection.Open();
        int tenderId = (int)(decimal)command.ExecuteScalar();
    }
}

答案 1 :(得分:5)

试试这个: -

con.Open();
string insertQuery = @"Insert into Tender (Name, Name1, Name2) values ('Val1','Val2','Val3');Select Scope_Identity();";

SqlCommand cmd = new SqlCommand(insertQuery, con);
tenderId = Convert.ToInt32(cmd.ExecuteScalar());

修改

应该是这样,因为正确地指出scope_identity()返回一个数字(38,0): -

tenderId = Convert.ToInt32(cmd.ExecuteScalar());

注意:您仍然需要删除: -

cmd.ExecuteNonQuery();

答案 2 :(得分:2)

首先测试以下内容:

object id = cmd.ExcuteScalar()

设置断点并查看id的类型。它可能是Decimal,无法直接投放到int

答案 3 :(得分:1)

它需要Convert.ToInt32(cmd.ExecuteScalar());