我是如何从Tomas Petricek找到这个fssnip http://www.fssnip.net/hh的。它很好地隐藏了很多非功能代码,同时使用ado.net SqlDataReader。再加上他在存储过程中的另一篇文章http://tomasp.net/blog/dynamic-sql.aspx/,它提供了一种使用原始查询和存储过程查询sql server的好方法。这对于想要使用原始查询但不够幸运的人使用sqlclient类型提供程序非常有用。这个FSharp动态运算符
但是,我无法弄清楚FSharp编译器/ CLR如何处理下列函数的返回类型。
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
当我把一个断点有关此功能,同时施加类似reader?amount
,(量为浮子式列)。当我将光标移动到函数签名上时,它显示返回类型'R
是执行此函数的单行代码之前的双精度值。编译器/ CLR实际上如何知道数量是一个数字的双倍?功能中似乎没有什么可以帮助推理?
问候
casbby
有这样一个稍长版本,一起在这里解释:http://msdn.microsoft.com/en-us/library/hh304373(v=vs.100).aspx – 2014-12-07 14:15:57
托马斯,感谢您的链接和帖子。有一点让人感到惊讶,围绕着一个不错的F#方式与旧的Sql服务器进行交互的讨论并不多。你的三个职位是我可以在F#中获得的最好的东西给Dapper。不是每个人都有幸能够访问sql2012 +。 – casbby 2014-12-08 00:59:34
@casbby,你为什么提到SQL2012?不要Tomas的教程适用于早期版本? – Mau 2014-12-08 11:48:38