私は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
'FirstOrDefault'を使用することの全体的なポイントは、シーケンス内に何もないかもしれないということです。その結果がそのまま存在するように結果を使用することはできません。 'FirstOrDefault'を呼び出した後は、まず' Nothing'であるかどうかを調べる必要があります。そうでない場合にのみ使用します。 – jmcilhinney
それが十分明確でない場合は、これについて考えてみてください。あなたが0人、1人またはそれ以上の人を含む部屋に入るとしましょう。あなたがその部屋で会う最初の人から$ 100を集めることができます。あなたが歩いていて人がいない場合、あなたのポケットに100ドルのマジックが現れますか?もちろん、それを収集する人がいる場合にのみ、お金を回収することができます。同様に、そのシーケンス内に少なくとも1つのアイテムがある場合は、シーケンス内の最初のアイテムのみを使用できます。 'First'は少なくとも一つの項目を必要とし、' FirstOrDefault'は項目がなければ 'Nothing'を返します。 – jmcilhinney
@jmcilhinneyそれは私がやったことではありませんか?シーケンスに何もない場合、IF(IsNot Nothing)は入力されず、End IFにまっすぐに進むでしょうか? –