运行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的信息
但是直到今天结束,我才能继续努力.所以链接可能是我的答案,但我无法确认.
我有一个函数,它接受输入并成功并返回一些输入或返回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来加强它: …
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) 我正在尝试使用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)