处理@@ Identity时无效的强制转换

时间:2012-07-27 14:18:23

标签: c# sql winforms

我有一个winforms应用程序,其中包含以下类方法:

public aSqlQuery(SqlCommand pSqlCom, string pMode = "object", bool pGetID = false)
    {
        try
        {
            string strConnection = aSystem.ConnectionString;
            SqlConnection linkToDB = new SqlConnection(strConnection);
            pSqlCom.Connection = linkToDB;

            switch (pMode)
            {
                case "non query":
                    {
                        linkToDB.Open();
                        pSqlCom.ExecuteNonQuery();
                        if (pGetID == true)
                        {
                            SqlCommand sqlCom = new SqlCommand("SELECT @@IDENTITY;", linkToDB);
                            this.LastID = (int)sqlCom.ExecuteScalar();
                        }
                        linkToDB.Close();
                    }
                    break;

加上其他开关

pSqlCom(SqlCommand)执行得很好,因为我可以看到写入数据库的数据。但是,随后的“SELECT @@ IDENTITY”语句会产生无效的强制转换错误 我做错了什么以及如何在类方法中检索SQL创建的新ID?

3 个答案:

答案 0 :(得分:1)

插入行并获取SCOPE_IDENTIY()给出的ID,不要使用@@IDENTITY

您需要在SCOPE_IDENTITY()之后的同一连接和范围内使用INSERT


在您的示例中,您的连接上没有执行INSERT,因此您无法获得上次生成的ID。

在您的示例中,pSqlCom执行INSERT并不明确,如果没有任何缩进功能将返回NULL无法转换为int


修改

您希望使用SCOPE_IDENTITY(),并且希望在与Command相同的INSERT内进行此操作。

所以,你的陈述应该像是

var sql =
@"INSERT <Your Data> <Your Table>;
SELECT SCOPE_IDENTIY();"

using (SqlConnection connection = new SqlConnection(strConnection))
{
    using (SqlCommand command = new SqlCommand(sql, connection))
    {
        connection.Open();
        object result = command.ExecuteScalar();
    }
}

int? id = (int?)(!Convert.IsDBNull(result) ? result : null);

答案 1 :(得分:-1)

它的正确答案是SELECT SCOPE_IDENTITY()语句必须与之前的INSERT语句形成相同的SqlCommand的一部分,但是我在之前的SqlCommand'pSqlCom'中包含了它。一旦SELECT SCOPE_IDENTITY()作为pSqlCom的一部分被包含,代码就正确地返回了Identity。

答案 2 :(得分:-2)

您对该命令的调用应返回非标量类型的内容。实际上你需要使用Int32。 MSDN上的Chek ExecuteScalar

另外,我建议您使用SCOPE_IDENTITY()代替@@Identity。查看following link以获取详细说明。