2016-10-19 6 views
0

私はDataSetsでの作業経験が豊富で、達成したいことを達成するための最良の方法を見つけることができませんでした。列の値に基づいてデータセットから最初の(最も古い)値を抽出する

私は基本的にSQLクエリを使用してDataSetを作成し、次に 'Field'列に特定の値を見つけようとしていますが、 'Flag'に 'Y'がある場合( 'N ')同じ行の列をクリックし、チェックボックスの状態を[チェック]に変更し、ラベルテキストを更新するようにします。私は1次回に.FirstOrDefault()()私はこのエラーを取得すると少しのコードを変更した場合

Object reference not set to an instance of an object

:データが、私は以下のエラーを取得返されていない場合

私は何を持っていることが動作しているようです:

Sequence contains no elements

問題の原因と思われるコードの一部を以下に示します。 。それは書かれているはず

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 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 
+0

'FirstOrDefault'を使用することの全体的なポイントは、シーケンス内に何もないかもしれないということです。その結果がそのまま存在するように結果を使用することはできません。 'FirstOrDefault'を呼び出した後は、まず' Nothing'であるかどうかを調べる必要があります。そうでない場合にのみ使用します。 – jmcilhinney

+0

それが十分明確でない場合は、これについて考えてみてください。あなたが0人、1人またはそれ以上の人を含む部屋に入るとしましょう。あなたがその部屋で会う最初の人から$ 100を集めることができます。あなたが歩いていて人がいない場合、あなたのポケットに100ドルのマジックが現れますか?もちろん、それを収集する人がいる場合にのみ、お金を回収することができます。同様に、そのシーケンス内に少なくとも1つのアイテムがある場合は、シーケンス内の最初のアイテムのみを使用できます。 'First'は少なくとも一つの項目を必要とし、' FirstOrDefault'は項目がなければ 'Nothing'を返します。 – jmcilhinney

+0

@jmcilhinneyそれは私がやったことではありませんか?シーケンスに何もない場合、IF(IsNot Nothing)は入力されず、End IFにまっすぐに進むでしょうか? –

答えて

2

このコードはiunefficiencyもバグではないだけを導入しているように思われます

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 

あなたはCheckboxCheckStateを使用することはありませんが、私はそれを疑う:

また、私はむしろ、これを参照してくださいね。 Formatについては、もうVB6ではなくトートです。

関連する問題