2014-12-07 3 views
2

Tomas Petricek에서이 fssnip http://www.fssnip.net/hh을 발견했습니다. 그것은 ado.net SqlDataReader를 사용하는 동안 많은 비 기능 코드를 멋지게 숨 깁니다. 함께 저장된 proc http://tomasp.net/blog/dynamic-sql.aspx/에 대한 또 다른 게시물과 함께 원시 쿼리 및 저장된 proc를 사용하여 SQL Server를 쿼리하는 좋은 방법을 제공합니다. 원시 쿼리를 사용하려고하지만 sqlclient 유형 공급자를 사용할만큼 운이 좋은 사람에게는 매우 유용 할 수 있습니다.이 FSharp 동적 연산자는 어떻게합니까

그러나 FSharp 컴파일러/CLR이 다음 함수의 반환 형식을 어떻게 처리하는지 알 수 없습니다. (금액은 플로트 식 열입니다), reader?amount 같은 것을 적용하는 동안 나는이 함수에 브레이크 포인트를 넣어

let (?) (reader:SqlDataReader) (name:string) : 'R = 
    let typ = typeof<'R> 
    if typ.IsGenericType && typ.GetGenericTypeDefinition() = typedefof<option<_>> then 
    if reader.[name] = box DBNull.Value then 
     (box null) :?> 'R 
    else typ.GetMethod("Some").Invoke(null, [| reader.[name] |]) :?> 'R 
    else 
    reader.[name] :?> 'R 

. 함수 서명 위로 커서를 이동하면 반환 형식이 표시됩니다. 'R은이 함수의 코드 한 줄을 실행하기 전에 두 번입니다. 컴파일러/CLR 실제로 양을 두 번 알 수 있습니까? 추측에 도움을 줄 수있는 함수가 없습니다.

관련

casbby

+1

이의 약간 더 긴 버전이있다 (유형이 일치하지 않는 경우 예외를 얻을 것이다,하지만) 좀 더와 함께 반환 값을 알아낼 명시 적 CLR 지원에 대한 필요가 없습니다

설명은 여기 : http://msdn.microsoft.com/en-us/library/hh304373(v=vs.100).aspx –

+0

Tomas, 링크 및 게시물을 보내 주셔서 감사합니다. 약간의 놀람은 좋은 F # 방식으로 이전 Sql 서버와 상호 작용하는 것에 대한 많은 토론이 없다는 것이 었습니다. 당신의 세 게시물은 내가 F #에서 Dapper에게 줄 수있는 옷장 물건입니다. 모든 사용자가 sql2012 +에 액세스 할 수있을만큼 운이 좋은 것은 아닙니다. – casbby

+0

@casbby, 왜 SQL2012를 언급하고 있습니까? Tomas의 튜토리얼은 이전 버전에서 작동하지 않습니까? – Mau

답변

4

그래서 여기에 키는 'R입니다.

이것은 표준 유형 추론을 사용하여 컴파일 타임에 유추 할 수 있습니다.

+2

John, 감사합니다. 세 번째로 당신의 의견을 읽을 때 갑자기 나에게왔다. 왜냐하면 필자가 레코드 형'type figure {amount : double}'을 정의했기 때문입니다. 그리고 나는 기록 (양 = 독자? 양)을 산출한다. 만약 내가 뭔가 '어리석은 peopleTable'에서 firstName [Amount]를 선택하면, 컴파일러는 double이라는 것을 추측 할 것이고, 실제로는 문자열이기 때문에 실행이 실패 할 것입니다. 그것은 정말로 그것이 컴파일러에게 (실현하지 않고) 어떤 타입인지를 말하기보다는 그것이 마술 적으로 무엇인지를 알아내는 것입니다. – casbby