- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 F# TypeProviders 处理来自两个不同服务器但许多数据库的 SQL 数据。一切进展顺利,除了速度现在随着我添加更多文件而变得非常慢。目前每个文件都有自己的连接字符串。我正在考虑将连接字符串和类型提供程序提取到外部项目,并能够将数据库作为参数传递。为了实现这一目标,我尝试执行以下操作,遵循以下链接 F# Type Provider, create with string variable 中的第三个答案。 :
open System.Configuration
open System.Data.SqlClient
open Microsoft.FSharp.Data.TypeProviders
open System.Data.SqlClient
let con = ConfigurationManager.AppSettings.Item("conDebug")
let setDB dbName =
let cn = new SqlConnectionStringBuilder(con)
cn.InitialCatalog <- dbName
cn.ConnectionString
[<Literal>]
let conStr = setDB "AnotherDB"
type selectedDb = SqlDataConnection<conStr>
但不断收到错误:这不是有效的常量表达式是否也可以在 SqlDataConnection
中使用 ChangeDatabase
成员?
更新:在这种情况下,建议的答案无法解决我的问题。下面是类似于对来自两个不同服务器的不同表所做的操作:
[<Literal>]
let sourceConStr = @"sourceCon"
type sourceDB = SqlDataConnection<sourceConStr>
type person =
{ Id : string
birthDate : Nullable<DateTime>
firstName : string
lastName : string
dateCreated : DateTime }
type processPeople()
member this.makePerson(oldPerson: source.ServiceTypes.Person) =
{ Id = oldPerson.oldId
......some other processing of old data
}
member this.transferPeople conStr =
use source = sourceDB.GetDataContext()
use sw = File.AppendText("./ImportLog.txt")
use targetCon = new SqlConnection(conStr)
targetCon.Open()
let query = "insert query"
let insert person =
try
use cmd = new SqlCommand(query, targetCon)
....setting parameters stuff......
cmd.ExecuteNonQuery() |> ignore
with sx -> sw.WriteLine(sx.Message)
source.source.ServiceTypes.Person
|> Seq.map this.makePerson
|> Seq.filter (fun p -> p.Id <> null && p.birthDate.HasValue )
|> Seq.iter insert
printfn "Done"
现在我需要对每个表(即每个表的类)执行此操作,并且随着文件的增长,编译和智能感知启动需要很长时间。
最佳答案
您尝试采用的方法存在根本缺陷。您希望在运行时从应用程序配置中获取连接字符串并提供 SqlDataConnection
输入提供程序以利用底层数据库发挥其魔力。
但是这种类型提供程序根本无法在工作流的运行时阶段执行任何操作,因为其工作必须在某些编译时已知数据库上在编译时完成。
那么,您可能会问,如果我们想让我们的代码在编译一次后能够在运行时配置数据库,那么使用类型提供程序有什么意义呢?
是的,但我们确实希望类型提供程序工作的结果适用于结构相同的数据库,是吗?
因此,出路是提供类型提供程序来在数据库上完成其工作 compileTimeDB
在编译时连接字符串字面上已知 compileTimeCC
,并考虑我们在连接字符串上参数化获得的所有好处(类型检查、智能感知等)。此连接字符串参数值runTimeCC
可以在运行时以任何所需的方式设置,只要它指向数据库 runTimeDB
与 compileTimeDB
具有相同的架构.
用下面的一些代码来说明这一基本原理:
[<Literal>]
let compileTimeCC = @"Data Source=(localdb)\ProjectsV12;Initial Catalog=compileTimeDB;Integrated Security=True;"
.....
type MySqlConnection = SqlDataConnection<ConnectionString = compileTimeCC>
// Type provider is happy, let it help us writing our DB-related code
.....
let db = MySqlConnection.GetDataContext(runTimeCC)
// at run time db will be a runTimeDB set by connection string runTimeCC that can be any
// as long as runTimeDB and compileTimeDB has same schema
.....
更新随着问题作者使他的问题背景更加清晰,我可能会在使用给定的 TP 解决此问题时提出更具体的建议。由于SO答案应该相当简洁,让我们限制两个遗留的考虑Person
类型OldPersonT1
和OldPersonT2
作为数据源和当代人ModernPerson
输入目的地。我在这里讨论的是类型,您的数据库场周围可以有任意数量的此类实例。
现在,让我们在 localdb
创建一个数据库命名CompileTypeDB
并运行Sql脚本来创建OldPersonT1
对应的表, OldPersonT2
,和ModernPerson
(这是一次性练习,不会涉及真正的数据移动)。这将是 SqlDataConnection
的类型信息的单一来源。 TP。
准备好后,让我们回到代码:
type CTSqlConn = SqlDataConnection<ConnectionString = @"Data Source=(LocalDB)\Projectsv12;Initial Catalog=myCompileTimeDB;Integrated Security=True">
type OldPersonT1 = CTSqlConn.ServiceTypes.OldPersonT1 // just for brevity
type OldPersonT2 = CTSqlConn.ServiceTypes.OldPersonT2
type ModernPerson = CTSqlConn.ServiceTypes.ModernPerson
然后,使用以下静态成员来扩充每个旧类型(为了简洁起见,下面给出 OldPersonT1
):
type CTSqlConn.ServiceTypes.OldPersonT1 with
static member MakeModernPersons(rtConn: string) =
let projection (old: OldPersonT1) =
// Just a direct copy, but you may be very flexible in spreading verification
// logic between query, projection, and even makeModernPersons function
// that will be processing IQueryable<ModernPerson>
let mp = ModernPerson()
mp.Id <- old.Id
mp.birthDate <- old.birthDate
mp.firstName <- old.firstName
mp.lastName <- old.lastName
mp.dateCreated <- old.dateCreated
mp
query {
for oldPerson in (CTSqlConn.GetDataContext(rtConn)).OldPersonT1 do
select (projection oldPerson)
}
现在您可以联系IQueryable<ModernPerson>
来自 OldPersonT1
类型的任何数据源仅通过评估
OldPersonT1.MakeModernPersons("real time connection string to any DB having OldPersonT1 table")
要使其工作,实时数据库可能与编译时数据库不同,它应该包含 OldPersonT1
的所有内容。具有并取决于。OldPersonT2
也是如此。或任何其他变体类型:通过实现 MakeModernPersons
对于每个变体类型,您可以获得覆盖的所有数据源实例。
处理数据目标需要一个带有签名的函数
let makeModernPersons destinationConnStr (source: IQueryable<ModernPerson>) =
...
现在涵盖了 Person
的所有可能组合只需通过操作两个实时连接字符串的值即可确定数据源和目标。
剪裁非常粗糙,但想法似乎很清晰。
关于F# TypeProviders,如何更改数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32312503/
SO亲爱的 friend 们: 2014 年 3 月 18 日。我正在处理一种情况,在使用 ng-repeat 时,数组内的元素(我从 Json 字符串中获取)更改了原始顺序。 需要明确的是,数组中的
有很多问题询问如何在 JavaScript 单击处理程序中更改 div 的类,例如,此处:Change Div style onclick .我理解得很好(只需更改 .className),并且它有效
我从access导入了一个数据库到mysql,但其中一个表的列名“股数”带有空格,但我尝试更改、替换甚至删除列名,但失败了。任何人都可以帮助解决这一问题 String UpdateQuary = "U
我正在做一个随机的学校元素。 目前,我有一个包含两个 CSS 的页面。一种用于正常 View ,一种用于残障人士 View 。 此页面还包括两个按钮,它们将更改使用的样式表。 function c
我需要使用 javascript 更改 HTML 元素中的文本,但我不知道该怎么做。 ¿有什么帮助吗? 我把它定义成这样: Text I want to change. 我正在尝试这样做: docum
我在它自己的文件 nav_bar.shtml 中有一个主导航栏,每个其他页面都包含该导航栏。这个菜单栏是一个 jQuery 菜单栏(ApyCom 是销售这些导航栏的公司的名称)。导航栏上的元素如何确定
我正在摆弄我的代码,并开始想知道这个变化是否来自: if(array[index] == 0) 对此: if(!array[index] != 0) 可能会影响任何代码,或者它只是做同样的事情而我不需
我一直在想办法调整控制台窗口的大小。这是我正在使用的函数的代码: #include #include #define WIDTH 70 #define HEIGHT 35 HANDLE wHnd;
我有很多情况会导致相同的消息框警报。 有没有比做几个 if 语句更简单/更好的解决方案? PRODUCTS BOX1 BOX2 BOX3
我有一个包含这些元素的 XELEMENT B Bob Petier 19310227 1 我想像这样转换前缀。 B Bob Pet
我使用 MySQL 5.6 遇到了这种情况: 此查询有效并返回预期结果: select * from some_table where a = 'b' and metadata->>"$.countr
我想知道是否有人知道可以检测 R 中日期列格式的任何中断的包或函数,即检测日期向量格式更改的位置,例如: 11/2/90 12/2/90 . . . 15/Feb/1990 16/Feb/1990 .
我希望能够在小部件显示后更改 GtkButton 的标签 char *ButtonStance == "Connect"; GtkWidget *EntryButton = gtk_button_ne
我正在使用 Altera DE2 FPGA 开发板并尝试使用 SD 卡端口和音频线路输出。我正在使用 VHDL 和 C 进行编程,但由于缺乏经验/知识,我在 C 部分遇到了困难。 目前,我可以从 SD
注意到这个链接后: http://www.newscientist.com/blogs/nstv/2010/12/best-videos-of-2010-progress-bar-illusion.h
我想知道在某些情况下,即使剧本任务已成功执行并且 ok=2,ansible 也会显示“changed=0”。使用 Rest API 和 uri 模块时会发生这种情况。我试图找到解释但没有成功。谁能告诉
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicate: add buttons to push notification alert 是否可以在远程通知显示的警报框中指定有
当您的 TabBarController 中有超过 5 个 View Controller 时,系统会自动为您设置一个“更多” View 。是否可以更改此 View 中导航栏的颜色以匹配我正在使用的颜
如何更改.AndroidStudioBeta文件夹的位置,默认情况下,该文件夹位于Windows中的\ .. \ User \ .AndroidStudioBeta,而不会破坏任何内容? /编辑: 找
我目前正在尝试将更具功能性的编程风格应用于涉及低级(基于 LWJGL)GUI 开发的项目。显然,在这种情况下,需要携带很多状态,这在当前版本中是可变的。我的目标是最终拥有一个完全不可变的状态,以避免状
我是一名优秀的程序员,十分优秀!