【问题标题】:SqlDataAdapter and Computed Columns; not maintained?SqlDataAdapter 和计算列;不维护?
【发布时间】:2015-04-22 15:56:22
【问题描述】:

假设我有以下 SQL 架构:

SQL

TABLE Person COLUMNS 
( 
   ID AS INTEGER, 
   Firstname AS varchar(100), 
   Lastname AS varchar(100), 
   Fullname AS (Firstname + ' ' + Lastname)
)
GO
INSERT INTO Person (ID, Firstname, Lastname) VALUES (1, 'Simon', 'Dugré')
GO

VB 检索类

Dim da as new SqlDataAdapter("SELECT ID, Firstname, Lastname, FullName FROM Person WHERE ID = 1", cn)
Dim ds as new DataSet()
da.Fill(ds)
da.FilleSchema(ds) ' I tried this before or after da.fill, just in case '

Dim dr as DataRow = ds.table(0).row(0)
Assert.IsTrue(dr("Firstname") = "Simon") ' Returns true '
Assert.IsTrue(dr("Lastname") = "Dugré") ' Returns true '
Assert.IsTrue(dr("Fullname") = "Simon Dugré") ' Returns true '
dr("Firstname") = "Nomis"
Assert.IsTrue(dr("Fullname") = "Nomis Dugré") ' Return False, it is still "Simon Dugré" in it. '

在即时窗口中调试时,我看到以下内容:

?dr.table.Columns("Fullname").Computed ' It says it is set to false... Duhhh... no!'

更多信息

我在一些地方看到有一种方法可以通过引用属性而不是 SQL 字段直接从代码中“硬编码”计算列公式......但我不能这样做,因为为了保持这个问题的可读性,我删除了很多代码,但这实际上是整个抽象和通用场景的一部分。

我的问题是,实际上有没有一种方法可以在调用da.Fillda.FillSchema 时直接从SQL 中检索公式?那么在更改FirstnameLastname时,会自动对Fullname计算列产生影响?

【问题讨论】:

    标签: sql .net vb.net sqldatareader


    【解决方案1】:

    它不在DataTable 中计算。这与该列在数据库中的定义方式无关 :)

    SQL 表达式和 IL 之间没有直接转换,因此您必须自己手动输入,并根据需要进行维护。

    当然,如果您只处理简单的表达式,那么自动翻译它们很容易,您只需要编写一个解析器。对于这样的事情,它甚至不是那么难。

    【讨论】:

    • 但在我的情况下,我正在做一个自己实现的 DAL(它保持非常简单,没有什么太复杂)并试图使其尽可能通用......所以我认为这是不可能的然后做:/
    • 嗯,我认为这是不可能的一个原因是因为可以在当前表中设置一个 SQL 函数而不是 2 个计算字段......这将无法在 VB.net 代码中获取... 好吧。谢谢@Luaan。
    猜你喜欢
    • 2011-07-25
    • 2013-03-31
    • 2016-12-07
    • 1970-01-01
    • 2022-12-09
    • 2013-05-13
    • 2016-12-19
    • 2014-03-23
    • 1970-01-01
    相关资源
    最近更新 更多