Sybase ASEを使用してDapperの強いタイプのクエリパラメーターを使用するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/7823668

質問

ダッパー クエリパラメーターを匿名オブジェクトとして渡すことができ、ADO.NETデータプロバイダーをサポートできます。ただし、Sybase 15 ADO.NETドライバーに対して次のクエリを実行する場合:

using (var connection = new AseConnection("..."))
{
    connection.Open();

    var results = connection.Query<Foo>(
        "dbo.sp_columns", new { table_name = "dbo.sysusers"}, 
        commandType: CommandType.StoredProcedure);
}

...次のエラーがスローされます。

Sybase.Data.AseClient.AseException: Procedure sp_columns expects parameter @table_name, which was not supplied.

at Sybase.Data.AseClient.AseCommand.ᜁ(Int32 A_0)
at Sybase.Data.AseClient.AseCommand.ᜄ()
at Sybase.Data.AseClient.AseCommand.ᜀ(CommandBehavior A_0)
at Sybase.Data.AseClient.AseCommand.System.Data.IDbCommand.ExecuteReader()
at Dapper.SqlMapper.<QueryInternal>d__13`1.MoveNext() in SqlMapper.cs: line 579
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList(IEnumerable`1 source)
at Dapper.SqlMapper.Query(IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in SqlMapper.cs: line 536

それをダッパーに変更します DynamicParameters 「@table_name」で設定も機能しません。

強くタイプのパラメーターをダッパーとSybaseに渡すにはどうすればよいですか?

役に立ちましたか?

解決

私が知る限り、その理由はSybaseのものと関係があるようです AseParameter クラス、そして正しくマッピングではありません DbTypeAseDbType 値。

カスタムダッパーを定義することで、問題を回避できます IDynamicParameters 設定し、それを入力します AseParameter 直接オブジェクト:

public class AseCommandParameters : List<AseParameter>, SqlMapper.IDynamicParameters
{
    public void AddParameters(IDbCommand command, SqlMapper.Identity identity)
    {
        foreach (var parameter in this)
            command.Parameters.Add(parameter);
    }
}

そして、インスタンスをクエリに渡す:

using (var connection = new AseConnection("..."))
{
    connection.Open();

    var parameters = new AseCommandParameters
    {
        new AseParameter("@table_name", "dbo.sysusers")
    };

    var results = connection.Query<Foo>("dbo.sp_columns", parameters, 
        commandType: CommandType.StoredProcedure);
}

これは機能し、また指定することができます AseDbType 各パラメーターに対して。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top