小编Rom*_*eEE的帖子

找不到F#SQL Server类型提供程序.NET SDK工具.Windows 10

运行Windows 10,Visual Studio社区2015和SQL Server 2014 Express.我也安装了.Net 3.5,4.0,4.5.

我的SqlDataConnection抛出编译时错误"类型提供程序'Microsoft.FSharp ...'...读取架构时出错.找不到.NET SDK 4.0或4.5工具".正在搜索解决方案,我被定向到一些注册表项.

  HKLM\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows 
Run Code Online (Sandbox Code Playgroud)

我有两个键:\ v8.0A和\ v8.1A.(我没有任何v7.xxx的密钥)我从这个问题的一个在线答案得到了这些密钥.这些键中的每一个都有三个键:WinSDK-NetFx ...工具.对于v8.0A,省略号为"35",对于v8.1A,省略号为"40".加上每个键重复+" - x64"和+" - x86".

这六个键都具有字符串值"InstallationFolder"(以及"ComponentName"和"ProductVersion").

我转到安装文件夹,每个文件夹都有ResGen.exe和SqlMetal.exe(这些文件是其他答案所说的文件).所以看起来我有必要的注册表键指向必需的exe.

在v7.0A和v8.1A的安装文件夹旁边,我还有一个用于v10.0A.所以我尝试创建一些名为v10.0A的其他注册表项.在那些v10.0A密钥中,我尝试将v10.0A文件夹作为InstallationFolder,我也尝试将v8.1A文件夹作为installationFolder.(我尝试这种排列的一个原因是因为错误消息要求SDK 4.0或4.5,而v10.0A文件夹有NETFX 4.6工具.所以我尝试通过改变注册表项来解决v4.5和v4.6之间可能的不一致在v10.0A下并使用v8.1A文件夹中的v4.5路径.)

我可能已经花了太长时间试图提供相关信息.但是我安装和更新了最新的软件,并且我试图按照之前给出的解决方案.我被卡住了.也许所有最新版本都没有相互捆绑在一起?

任何帮助赞赏很多.

编辑:进行更多的网络搜索,我现在正在寻找更多详细信息的修复程序.这个看起来非常有希望:

需要澄清有关Microsoft.FSharp.Data.TypeProviders的信息

但是直到今天结束,我才能继续努力.所以链接可能是我的答案,但我无法确认.

sql-server sdk f# type-providers windows-10

6
推荐指数
1
解决办法
693
查看次数

F#惯用尝试直到

我有一个函数,它接受输入并成功并返回一些输入或返回None.我将举例说明拨打的电话号码列表,直到有人回答其中一个号码,然后应跳过其余的号码.最后会记录成功的号码或错误消息.

我认为我的第一个解决方案太复杂了,并且在第一次尝试时也使用了故障状态的播种,这似乎是不优雅的:

type PhoneNumber = int

let tryCallNumber phoneNumber = 
    if phoneNumber % 2 = 0 then Some phoneNumber
    else None

let nextCall phoneNumberOption nextNumber = 
    match phoneNumberOption with
    | Some num -> phoneNumberOption
    | None     -> tryCallNumber nextNumber

let logCall phoneNumberOption = 
    match phoneNumberOption with
    | Some num -> printfn "%i" num
    | None     -> printfn "%s" "failed"


let phoneNumbers = [111; 222; 444; 555]

do List.fold (fun state num -> (nextCall state num)) None phoneNumbers
|> logCall
Run Code Online (Sandbox Code Playgroud)

我用一个更好的List函数,tryPick来加强它: …

error-handling f#

6
推荐指数
1
解决办法
108
查看次数

F#,小型推理/注释错误

F#中的这一行给出了在"x.Day"处可能需要类型注释的错误.

  let daysList = List.map (fun x -> x.Day) datesList
Run Code Online (Sandbox Code Playgroud)

但intellisense显示x的类型为DateTime(在"fun x"处).而且datesList的类型是DateTime列表.所以我很困惑为什么我必须像这样声明x的类型然后一切正常:

  let daysList = List.map (fun (x:System.DateTime) -> x.Day) datesList
Run Code Online (Sandbox Code Playgroud)

f# datetime types type-inference

2
推荐指数
1
解决办法
70
查看次数

F#异常处理多个"尝试"

我正在尝试使用SQL Bulk Insert和DataContext.ExecuteCommand在SQL Server中读取一堆csv文件.(也许这不是最好的方法,但它确实允许我留在Type Provider上下文 - 而不是我认为的SqlBulkCopy.)现在上传很麻烦,间歇性的成功.有些文件读入,有些文件因"数据转换错误(截断)"而失败.我认为这与行终止符并不总是有效.

当上传工作时,似乎是'0x0A'终止符.但是当失败时,我想再次尝试使用其他行终止符.所以我想进入一个Try语句,并且在失败时进入另一个Try语句,如果那个失败则进入另一个语句...... 这可能不是上传的最佳方式,但我仍然对它自己的状态的Try逻辑感到好奇.

这是我到目前为止所提出的并且它不太漂亮(但它有效).切出几个嵌套层:

let FileRead path = 

    try
        db.DataContext.ExecuteCommand(@"BULK INSERT...ROWTERMINATOR='0x0A')") |> ignore 
        true
    with
        | exn -> 
            try
                db.DataContext.ExecuteCommand(@"BULK INSERT...ROWTERMINATOR='\r')") |> ignore 
                true
            with
                | exn -> 
                    try
                        db.DataContext.ExecuteCommand(@"BULK INSERT...ROWTERMINATOR='\n')") |> ignore 
                        true
                    with
                        | exn -> 
                            false
Run Code Online (Sandbox Code Playgroud)

这感觉不对,但我还没有想出任何其他语法.

编辑:我最终做了什么,只是为了记录.欣赏被置于富有成效的道路上.在这方面有很多改进.有一个更重要的事情是使用Async并运行Parallel(我在其他部分已经获得了经验).

type dbSchema = SqlDataConnection<dbConnection>
let db = dbSchema.GetDataContext() 

let TryUpLd table pathFile rowTerm = 
    try
        db.DataContext.ExecuteCommand( @"BULK INSERT " + table + " FROM '" + pathFile + 
                                       @"' WITH (FIELDTERMINATOR=',', FIRSTROW = …
Run Code Online (Sandbox Code Playgroud)

f# exception-handling try-catch

2
推荐指数
1
解决办法
138
查看次数