2011-10-19 2 views
4

Dapper은 쿼리 매개 변수를 익명 개체로 전달할 수 있으며 모든 ADO.NET 데이터 공급자를 지원합니다. 사이베이스 15 ADO.NET 드라이버에 대해 다음 쿼리 실행 때 :Sybase ASE에서 Dapper의 강력한 유형의 쿼리 매개 변수를 사용하려면 어떻게해야합니까?

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 

는 "@table_name와 단정 한 DynamicParameters 세트로 변경 "또한 작동하지 않습니다.

Dapper를 사용하여 강력한 유형의 매개 변수를 Sybase에 전달하는 방법은 무엇입니까?

답변

7

제가 알 수있는 한, 이유는 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을 지정할 수 있습니다.

+1

매우 흥미 롭습니다! 나는 이것을 "핵심"라이브러리로 만드는 깔끔한 방법을 생각할 수는 없지만 ... 매혹적이다. –

+0

여기 wiki가 제거되었습니다. 요점을 보지 못했습니다. 이것은 IDynamicParameters의 좋은 사용법입니다. –

+0

또한 여기 sybase 티켓을 여는 것이 좋습니다 ... 그들은 **이 ** 깨진 –

관련 문제