Почему PetaPoco возвращается из базы данных? Вставьте поле идентификатора 7 как десятичное - PullRequest
3 голосов
/ 08 июня 2011

При выполнении вставки идентификатор переменной возвращается как объект.Однако в моей базе данных это int, а в моем POCO - int, однако, когда вызывается метод ExecuteScalar для возврата @@ IDENTITY, он возвращает число 7 как объект, но отладчик считает его десятичным.

Поэтому, когда я делаю int newID = (int)db.Insert(...), он выдает

InvalidCastException

Это ошибка фреймворка или ошибка PetaPoco?

Ответы [ 4 ]

7 голосов
/ 10 июня 2011

Также помните, что если вы настроили свой класс и вставили его так.

[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 на вновь созданное значение идентификатора

4 голосов
/ 08 июня 2011

Это будет зависеть от того, к какой СУБД вы подключаетесь, о чем вы не указали.

Вот соответствующий код из PetaPoco, который извлекает последний идентификатор и возвращает его:

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;
}
3 голосов
/ 17 сентября 2011

Еще два цента.Как уже ответили, PetaPoco возвращает десятичное число для вставок SQL Server.Автор вопроса пытается привести к int, который выбрасывает InvalidCastException.Тем не менее, преобразование типов работает.Поэтому вместо этого:

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

сделайте это:

int newID = Convert.ToInt32(db.Insert(...))
1 голос
/ 08 июня 2011

Это предположение, но оно того стоит.В PetePoco.cs попробуйте изменить:

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

на

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