为什么PetaPoco从数据库返回.插入一个ID字段7作为小数

本文关键字:字段 ID 一个 小数 数据库 PetaPoco 返回 插入 为什么 | 更新日期: 2023-09-27 17:58:31

执行Insert时,变量id将作为对象返回。然而,在我的数据库中,它是一个int,而在我的POCO中,它也是一个int。然而,当调用ExecuteScalar以返回@@IDENTITY的方法时,它会将数字7作为对象返回,但调试器认为它是十进制的。

因此,当我执行int newID = (int)db.Insert(...)时,它会抛出

InvalidCastException

这是一个框架错误还是PetaPoco错误?

为什么PetaPoco从数据库返回.插入一个ID字段7作为小数

还要记住,如果你已经设置了你的类,然后像这样插入。

[TableName("Users")]
[PrimaryKey("Id")]
public class User {
    public int Id {get;set;}
    public string Name {get;set;}
}
var user = new User() { Name = "My Name" };
db.Insert(user);
Assert.True(user.Id != 0);

user.Id现在将从0更改为新创建的标识值

这将取决于您连接到的RDBMS,而您没有说明。

以下是PetaPoco的相关代码,它检索最后一个id并返回:

object id;
switch (_dbType)
{
    case DBType.SqlServerCE:
        DoPreExecute(cmd);
        cmd.ExecuteNonQuery();
        id = ExecuteScalar<object>("SELECT @@@IDENTITY AS NewID;");
        break;
    case DBType.SqlServer:
        cmd.CommandText += ";'nSELECT SCOPE_IDENTITY() AS NewID;";
        DoPreExecute(cmd);
        id = cmd.ExecuteScalar();
        break;
    case DBType.PostgreSQL:
        if (primaryKeyName != null)
        {
            cmd.CommandText += string.Format("returning {0} as NewID", EscapeSqlIdentifier(primaryKeyName));
            DoPreExecute(cmd);
            id = cmd.ExecuteScalar();
        }
        else
        {
            id = -1;
            DoPreExecute(cmd);
            cmd.ExecuteNonQuery();
        }
        break;
    case DBType.Oracle:
        if (primaryKeyName != null)
        {
            cmd.CommandText += string.Format(" returning {0} into :newid", EscapeSqlIdentifier(primaryKeyName));
            var param = cmd.CreateParameter();
            param.ParameterName = ":newid";
            param.Value = DBNull.Value;
            param.Direction = ParameterDirection.ReturnValue;
            param.DbType = DbType.Int64;
            cmd.Parameters.Add(param);
            DoPreExecute(cmd);
            cmd.ExecuteNonQuery();
            id = param.Value;
        }
        else
        {
            id = -1;
            DoPreExecute(cmd);
            cmd.ExecuteNonQuery();
        }
        break;
    default:
        cmd.CommandText += ";'nSELECT @@IDENTITY AS NewID;";
        DoPreExecute(cmd);
        id = cmd.ExecuteScalar();
        break;
}

另外两美分。正如已经回答的那样,PetaPoco为SQL Server插入返回一个小数。问题作者正试图强制转换为引发InvalidCastException的int。但是,类型转换确实有效。因此,取而代之的是:

int newID = (int)db.Insert(...)

这样做:

int newID = Convert.ToInt32(db.Insert(...))

这只是猜测,但值得一试。在PeterPoco.cs尝试更改:

id = ExecuteScalar<object>("SELECT @@@IDENTITY AS NewID;");

id = ExecuteScalar<int>("SELECT @@@IDENTITY AS NewID;");