2011-10-19 8 views
4

Dapperは、クエリパラメータを匿名オブジェクトとして渡すことができ、任意のADO.NETデータプロバイダをサポートします。 Sybaseの15 ADO.NETドライバに対して、次のクエリ実行するときしかし、:Dapperの強く型付けされたクエリパラメータをSybase ASEで使用するにはどうすればよいですか?

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 

をDapperのDynamicParametersセットに変更@table_name」と"また動作しません。

Dapperを使用して強く型付けされたパラメータをSybaseに渡すにはどうすればよいですか?

答えて

7

私の知る限り、理由はSybaseのAseParameterクラスと関係しており、DbTypeAseDbTypeの値に正しくマッピングしていないようです。

カスタムDapperの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を指定することもできます。

+1

これは非常に興味深いです!私はこれを "コア"ライブラリにするきれいな方法を考えることはできませんが、魅力的です。 –

+0

私はここでwikiを削除しました...ポイントが表示されません。これはIDynamicParametersの理由です。 –

+0

ここにsybaseでチケットを開くことをお勧めします...彼らは私が知っていることを知っている最初のプロバイダです** ** **壊れた –

関連する問題