基于列值从数据集中提取第一(最旧)值

时间:2016-10-19 08:43:02

标签: sql vb.net linq dataset

我没有很多使用DataSet的经验,并且无法找到实现我想要实现的目标的最佳方式。

我基本上使用SQL查询创建一个DataSet,然后我试图在' Field'中找到一个特定的值。列,然后如果有一个' Y'在'旗帜' (与同一行中的“N&#;”列相对应,我希望它将复选框的状态更改为“已检查”以及更新标签文本。

我有什么似乎工作,但如果没有返回数据我得到以下错误:

  

对象引用未设置为对象的实例

如果我将代码从.FirstOrDefault()稍微更改为.First(),我会收到此错误:

  

序列不包含元素

下面列出了导致问题的代码部分。如果您需要了解其他任何内容,我会将其添加进去。

    Dim sSQL As String
    sSQL =
        <SQL>
            SELECT MAX(UpdateTime) AS UpdateTime FROM AdminCS_Data_Current
            WHERE UpdateUser = |@@UpdateUser|
        </SQL>
    sSQL = Replace(sSQL, "@@UpdateUser", AdminCB.Text)
    Me.LastUserUpdate.Text = "Last Action: " & Format(ReturnDatabaseValue(sSQL, "UpdateTime", "Data"), "dd/MM/yyyy HH:mm:ss")

    Dim EmployeeDataset As New DataSet
    Try
        sSQL =
            <SQL>
                SELECT * FROM AdminCS_Data_Current
                WHERE UpdateUser = |@@UpdateUser| AND CONVERT(DATE, UpdateTime) = CAST(GETDATE() AS  DATE)
                ORDER BY UpdateTime ASC 
            </SQL>
        sSQL = Replace(sSQL, "@@UpdateUser", AdminCB.Text)
        EmployeeDataset = ReturnDataSet(sSQL, "Data")

        If EmployeeDataset IsNot Nothing Then
            Dim eData = EmployeeDataset.Tables(0)
            If (eData.Select("Field = 'Timesheets Checked'").FirstOrDefault()("Flag")) IsNot Nothing Then
                If eData.Select("Field = 'Timesheets Checked'").FirstOrDefault()("Flag").ToString.Trim = "Y" Then
                    TShtY.CheckState = CheckState.Checked
                    TShtTime.Text = Format(eData.Select("Field = 'Timesheets Checked'").First()("UpdateTime"), "HH:mm:ss")
                Else
                    TShtN.CheckState = CheckState.Checked
                End If
            End If
           ' The above two IF statements would be repeated several times on each change of "Field" 
        End If

1 个答案:

答案 0 :(得分:2)

看起来这段代码不仅引入了iunefficiency,还引入了一个bug:

    If (eData.Select("Field = 'Timesheets Checked'").FirstOrDefault()("Flag")) IsNot Nothing Then
        If eData.Select("Field = 'Timesheets Checked'").FirstOrDefault()("Flag").ToString.Trim = "Y" Then
            TShtY.CheckState = CheckState.Checked
            TShtTime.Text = Format(eData.Select("Field = 'Timesheets Checked'").First()("UpdateTime"), "HH:mm:ss")
        Else
            TShtN.CheckState = CheckState.Checked
        End If
    End If

首先应该这样写:

    Dim row = eData.Select("Field = 'Timesheets Checked'").FirstOrDefault()

    If row IsNot Nothing Then
        If row("Flag").ToString.Trim = "Y" Then
            TShtY.CheckState = CheckState.Checked
            TShtTime.Text = Format(row("UpdateTime"), "HH:mm:ss")
        Else
            TShtN.CheckState = CheckState.Checked
        End If
    End If

更容易阅读,更有效率,并避免这个讨厌的错误。

另外,我更愿意看到这个:

    Dim row = eData.Select("Field = 'Timesheets Checked'").FirstOrDefault()

    If row IsNot Nothing Then
        If row("Flag").ToString.Trim = "Y" Then
            TShtY.Checked = True
            TShtTime.Text = CDate(row("UpdateTime").ToString("HH:mm:ss")
        Else
            TShtN.Checked = True
        End If
    End If

你永远不应该使用CheckState的{​​{1}},除非它是三态,也许是你的,但我对此表示怀疑。至于Checkbox,我们不再是VB6了。