2

我有一个包含以下类方法的 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?

4

3 回答 3

1

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

您需要SCOPE_IDENTITY()在相同的连接和范围上使用,就在INSERT.


在您的示例中,没有INSERT在您的连接上执行,因此您不能期望获得最后生成的 Id。

在您的示例中,不清楚pSqlCom执行一个INSERT,如果它不执行任何 indentity 函数将返回NULL,该函数无法转换为int


编辑

您想要使用SCOPE_IDENTITY()并且想要以CommandINSERT.

所以,你的陈述应该是这样的

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);
于 2012-07-27T14:27:07.353 回答
-1

事实证明,正确的答案是 SELECT SCOPE_IDENTITY() 语句必须与之前的 INSERT 语句构成相同的 SqlCommand 的一部分,但我包含在前面的 SqlCommand 'pSqlCom' 中。一旦将 SELECT SCOPE_IDENTITY() 作为 pSqlCom 的一部分包含在内,代码就会正确返回标识。

于 2012-07-27T20:33:10.573 回答
-2

您对命令的调用应该返回不是标量类型的东西。事实上,你需要使用 Int32 来代替。MSDN 上的Chek ExecuteScalar

另外,我建议您使用SCOPE_IDENTITY()而不是@@Identity. 检查以下链接以获取详细说明。

于 2012-07-27T14:22:54.757 回答