首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >F# SqlCommandProvider将eval延迟到运行时

F# SqlCommandProvider将eval延迟到运行时
EN

Stack Overflow用户
提问于 2015-09-09 17:59:57
回答 1查看 610关注 0票数 2

如果列不存在,我尝试使用SqlCommandProvider (FSharp.Data.SqlClient的一部分)创建列,然后设置约束(自引用)。问题是它不会编译,因为它检测到作为约束的一部分的列还不存在。我试着把它包在另一块里,但没有用。

代码语言:javascript
复制
[<Literal>]
let CreateParentColumn = "
    IF COL_LENGTH('Company', 'ParentId') IS NULL
    BEGIN
        ALTER TABLE Company
        ADD ParentId INT

        ALTER TABLE Company
        ADD CONSTRAINT FK_ParentIdCompanyId FOREIGN KEY (ParentId)
        REFERENCES Company(CompanyId);
    END
"

type CreateParentIdColumn  = SqlCommandProvider<CreateParentColumn, connectionString>

我非常希望不使用动态sql。我想知道是否有一种方法可以推迟计算,以便它能够正常运行(注意,查询本身在中运行良好)

错误1类型提供程序'FSharp.Data.SqlCommandProvider‘报告了一个错误:引用表'FK_ParentIdCustomerId’中的外键‘FK_ParentIdCustomerId’引用无效列'ParentId‘。无法创建约束。请参阅先前的错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-10 15:45:07

简单的回答是“不,这是不可能的”。

更详细的答案是“由于根本原因不能这样做:运行时数据库模式特性应该已经在编译时出现,以便被FSharp.Data.SqlClient类型提供程序使用”。

从学术兴趣的角度来看,在运行时在数据库中创建额外的列和约束并不是一个问题(尽管这是一个非常不寻常的实践),并且没有必要为此目的涉及动态SQL。通过与类型提供程序并排使用普通ADO可以很容易地实现:

代码语言:javascript
复制
use cmd = new System.Data.SqlClient.SqlCommand(CreateParentColumn, connectionString)
cmd.ExecuteNonQuery() |> ignore

但是,实际的问题是,这个新创建的列在FSharp.Data.SqlClient类型提供程序上下文中没有任何用处,因为它在编译时还不存在于数据库模式中,类型提供程序可以任意使用它。

重新措辞时,FSharp.Data.SqlClient类型提供程序不会在运行时执行任何操作,它的作业已在编译时完成。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32486345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档