3

挿入を実行すると、変数IDがオブジェクトとして返されます。ただし、私のデータベースではintであり、POCOではintですが、@@ IDENTITYを返すためのExecuteScalarのメソッド呼び出しが呼び出されると、オブジェクトとして数値7が返されますが、デバッガーはその小数を認識します。

したがって、私がint newID = (int)db.Insert(...)それを行うと、

InvalidCastException

これはフレームワークのバグですか、それともPetaPocoのバグですか?

4

4 に答える 4

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から新しく作成されたID値に変更されます

于 2011-06-10T04:10:51.887 に答える
5

接続しているRDBMSに依存しますが、これについては述べていません。

最後のIDを取得して返す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;
}
于 2011-06-07T22:17:45.407 に答える
4

さらに2セント。すでに回答したように、PetaPocoはSQLServerインサートの小数を返します。質問の作成者は、InvalidCastExceptionをスローするintにキャストしようとしています。ただし、型変換は機能します。したがって、これの代わりに:

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

これを行う:

int newID = Convert.ToInt32(db.Insert(...))
于 2011-09-16T20:17:02.193 に答える
1

推測ですが、一見の価値があります。PetePoco.csで変更してみてください:

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

id = ExecuteScalar<int>("SELECT @@@IDENTITY AS NewID;");
于 2011-06-08T09:44:22.117 に答える