DbParameterで渡すOracleのDapper

dapper oracle parameter-passing

質問

私はOracleと一緒にDapperを試していますが、私は複数の結果のクエリを実行しようとしていましたが、Oracleはrefcursorのdbtypeを必要としています。

StringBuilder query = new StringBuilder("BEGIN ");
query.Append("OPEN :rs1 FOR SELECT * FROM Table1 where key=:KEY; ");
query.Append("OPEN :rs2 FOR SELECT * FROM Table2 where key=:KEY; ");
query.Append("END;");
  • OracleParameter(おそらくDbParameter?)をDapperに渡す方法はありますか?私が試したとき、それは誤りを投げた。

  • DynamicParameterを使用する場合とDbParameterを使用する場合の利点は何ですか(タイプが分かっていると仮定してなど)。

受け入れられた回答

  1. SQL ServerのTVPをサポートするために追加されたが、このシナリオでは機能するはずの、新しいインターフェイスが最新のビルドに追加され、パラメータをより詳細に制御できるようになりました。ただし、dbparameterのような特殊なケーシングを追加して直接追加することもできます。直接追加すると、oracleパラメータを直接追加できます。

  2. それはたDbParameter議論対値にビット直交するようDynamicParametersは、 多くのパラメータを追加する方法についてです。現時点では、コードは一般的にパラメータ自体の追加を制御することを好みます。したがって、呼び出し側は、 "ado.netという詳細ではなく、値7のint型の名前付きID"を知っています。しかし、それはできます。


編集:あなたは本当にリストオブパラメータ( List<DbParameter>など)を使って作業したいのであれば、次のようにすることができます:

public class DbParams : Dapper.SqlMapper.IDynamicParameters,
                        IEnumerable<IDbDataParameter>
{
    private readonly List<IDbDataParameter> parameters =
        new List<IDbDataParameter>();
    public IEnumerator<IDbDataParameter> GetEnumerator() {
        return parameters.GetEnumerator(); }
    IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
    public void Add(IDbDataParameter value)
    {
        parameters.Add(value);
    }
    void Dapper.SqlMapper.IDynamicParameters.AddParameters(IDbCommand command,
        Dapper.SqlMapper.Identity identity)
    {
        foreach (IDbDataParameter parameter in parameters)
            command.Parameters.Add(parameter);
    }
}

次のように使用します。

public void TestCustomParameters()
{
    var args = new DbParams {
        new SqlParameter("foo", 123),
        new SqlParameter("bar", "abc")
    };
    var result = connection.Query("select Foo=@foo, Bar=@bar", args).Single();
    int foo = result.Foo;
    string bar = result.Bar;
    foo.IsEqualTo(123);
    bar.IsEqualTo("abc");
}

それは試験に合格する。

しかし、私は、 実際に知る必要がない限り、dbパラメータの知識を持った呼び出しコードに戸惑うことを好まないことを強調しなければなりません。私はこれまでのところ好むだろう:

var args = new {
    foo = 123, bar = "abc"
};

まったく同じことですが、ADO.NETに落とされることはありません。あなたが得る層ではありません 、その場合には-あなたは「飾ら」ADO.NET接続を(例えば、ミニプロファイラ)を使用している場合、これは特に重要になることがOracleCommand / OracleConnectionそれが抽象化される-など。つまり、 OracleParameterを強制的に追加すると必ずしも機能しない場合がありますが、名前が"foo"で値が123パラメータを追加するとかなり信頼性が高くなります。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ