Dapper에서 DynamicParameters의 내용 가져 오기

c# dapper reflection

문제

Oracle에서 MySQL로 데이터베이스를 마이그레이션하고 있습니다. Oracle과 MySQL은 바인드 변수 @: 다른 문자를 사용합니다. Dapper를 사용하여 데이터베이스를 쿼리합니다. 우리는 DynamicParameters를 Dapper로 전달하고 바인드 변수가 작동합니다.

내가 할 수 있기를 원하는 것은 DynamicParameters를 살펴보고 값의 이름을보고 앞의 문자를 변경 한 다음 SQL 문자열에서도 바꾸십시오. 나는 이것을 어떻게 할 것인지를 안다.

내가 가진 문제는 키와 값을 얻기 위해 DynamicParameters를 열거 할 수 없다는 것입니다.

내 생각은 리플렉션을 사용하여 런타임에 개인 <string, DynamicParameters.ParamInfo> parameters 필드를 유지하려고 시도하는 것입니다. DynamicParameters.ParamInfo 가 비공개 클래스 인 것처럼 작동하도록 만드는 방법을 찾을 수 없습니다.

내가 할 수있는 것에 대한 아이디어가 있습니까?

수락 된 답변

첫 번째 질문에는 두 가지 부분이 있습니다.

내가 할 수 있기를 원하는 것은 DynamicParameters를 살펴보고 값의 이름을보고 앞의 문자를 변경하는 것입니다.

두 번째는 :

SQL 문자열로 바꾸십시오.

첫 번째 부분은 Dapper가 얼마나 똑똑한 지 알기에 관심이있었습니다. DynamicParameters 에서 전달 된 인수를 처리하는 것이 충분히 똑똑하다는 것을 증명합니다. 다음 사항을 고려하십시오.

// Source of the DynamicParameters
var args = new Dictionary<string,string>();
args.Add("@emailPromotion", "1");
// additional args goes here

// An example of how you build a DynamicParameters
var dbArgs = new DynamicParameters();
foreach (var pair in args) dbArgs.Add(pair.Key, pair.Value);

// The query - using SQL Server (AdventureWorks)
var sql = "select * from Person.Contact WHERE EmailPromotion = @EmailPromotion";

// The Dapper call (this works as expected)
var items = the_connection.Query<dynamic>(sql, dbArgs);    

이제 colon 사용하여 Oracle에서 마이그레이션했으며이 원본에서 DynamicParameters를 전달했다고 가정 해 보겠습니다.

var oracle_args = new Dictionary<string,string>();
oracle_args.Add(":emailPromotion", "1");

주어진 코드의 나머지 부분과 함께 oracle_args 를 사용하면 여전히 작동합니다. SQL Server가 콜론을 이해할 수 없으므로 기대하지 않을 것입니다. 오류를 일으키는 유일한 원인은 쿼리 자체 ( var sql )에 유효하지 않은 문자 인 colon 입니다.

그렇다면 그 질문은 당신의 질문과 관련이 있습니까? 즉, " 첫 번째 부분 "에 대해 걱정할 필요가 없으며 Dapper가 자신의 업무를 수행 할 수 있습니다. " 두 번째 부분 "을 처리하고 (SQL) 쿼리를 조정하면됩니다. 쿼리를 완벽하게 제어 할 수 있으면 문제가 발생하지 않습니다. 간단한 문자열 대체가 트릭을 수행합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.