3

誰かが私を助けてくれるだろうか。私はプログラミングと開発に非常に慣れていないため、これがばかげた質問である場合は申し訳ありませんが、現在取り組んでいるプロジェクトにかなりこだわっています。

データベースから情報を取得するために 1 日 1 回実行する予定の WinForms アプリケーションをコーディングしています。これから、特定の基準が満たされた場合、建物内の個人に自動的にメールを送信することです。メッセージ本文には、データグリッドに取り込まれたさまざまな詳細が含まれます。

現在、電子メールの生成を担当するサブシステムに詳細を転送しようとすると、アプリケーションがクラッシュします (一部の変数が「Null」として返され、文字列に変換できないため)。以下のように、Null として返された場合に変数に文字列を割り当てる If ステートメントを実装しようとしています。

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles RunTimer.Tick

    years = My.Settings.Years.Split(",")

    If TimeOfDay = "09:00:00" Then
        Using cn As New SqlClient.SqlConnection
            cn.ConnectionString = constr
            cn.Open()

            SQLstr = "long SQL string that works as have run it in WinSQL"

            Using command As New SqlClient.SqlCommand(SQLstr, cn)
                command.CommandTimeout = 0
                command.CommandText = SQLstr
                Using drd As SqlClient.SqlDataReader = command.ExecuteReader
                    While drd.Read

                        If Not drd("Joined Date") Is DBNull.Value Then
                            Dim memberyears As Integer = DateDiff(DateInterval.Year, drd("Joined Date"), Now)
                            Dim element As Integer

                            For element = 0 To years.GetUpperBound(0)
                                If years(element) = memberyears Then
                                    Label1.Text = "Sending email"
                                End If
                                If Not drd("City") Is DBNull.Value Then
                                    drd("City") = "Bleh"
                                End If
                                SendEmail(years(element), drd("Shop Name"), drd("Contact Name"), drd("Shop ID"), drd("Business Name"), drd("Address 1"), drd("Address 2"), drd("Address 3"), drd("District"), drd("City"), drd("County"), drd("Shop Postal Code"), drd("ASM"))
                            Next
                        End If
                    End While
                End Using
            End Using
        End Using


    Else
        Label1.Text = "Skipped"
        Exit Sub
    End If

End Sub

If私が取り組んでいるステートメントは次のとおりです。

If Not drd("City") Is DBNull.Value Then
    drd("City") = "Bleh"
End If

ただし、プロパティ 'Item' が ReadOnly であるため、返されるだけです。これについて何か助けていただければ幸いです。

4

2 に答える 2

2

のレコードのフィールドは変更できませんSqlDataReader。はDataReaderデータの読み取りのみに使用されます。変更したい場合は、DataTable/DataRowを使用し、IsNullそのメソッドを使用してフィールドの値が null かどうかを確認します。

Using cn As New SqlClient.SqlConnection(constr)
    Using da = New SqlClient.SqlDataAdapter("long SQL string that works as have run it in WinSQL", cn)
        da.SelectCommand.CommandTimeout = 0
        Dim table = New DataTable()
        da.Fill(table)
        For Each row As DataRow In table.Rows
            If Not row.IsNull("Joined Date") Then
                Dim joined = row.Field(Of Date)("Joined Date")
                Dim memberyears As Long = DateDiff(DateInterval.Year, joined, Date.Now)
                For i As Int32 = 0 To years.Length - 1
                    If memberyears.ToString = years(i) Then
                        Label1.Text = "Sending email"
                        If Not row.IsNull("City") Then
                            row("City") = "Bleh"
                        End If
                        SendEmail(years(i), row("Shop Name"), row("Contact Name"), row("Shop ID"), row("Business Name"), row("Address 1"), row("Address 2"), row("Address 3"), row("District"), row("City"), row("County"), row("Shop Postal Code"), row("ASM"))
                    End If
                Next
            End If
        Next
    End Using
End Using
于 2013-04-06T13:12:15.397 に答える
0

はい、そうです。それはread only財産であり、

これに対する解決策は、variableからの値を保持することです。databaseしかし、これに注意してください。これに代入する前に、variableそれがそうであるかどうかを確認する必要がDbNullあります。

       Dim xCity as string = string.empty

       ....................
       ....................
       ....................

       xCity = if(IsDbNull(drd("City")),"some text","some other text")

次に、その変数xCityを将来の使用に使用します。

編集:

その追加の変数を避けたい場合は、その値を直接確認して、次のような有効な文字列を渡すことができます。

SendEmail(**,**, if(IsDbNull(drd("City")),"some text","some other text"), **, **, **)
于 2013-04-06T13:06:25.703 に答える