0

私は情報システムに取り組んでおり、更新の構文は次のとおりです。エラーは表示されませんが、テーブルは更新されません。誰でもこの問題について助けることができますか? ちなみに、VB.Net 2010 と MS Access 2007 を使っています。

Try
        Dim conn As New OleDbConnection(gConnectionString)
        If conn.State = ConnectionState.Closed Then
            conn.Open()
        End If
        Try
            Dim comm As New OleDbCommand( "UPDATE PropertiesPayors SET [PayorName]=@PayorName,[LotNumber]=@LotNumber,[LotArea]=@LotArea,[DateOfAward]=@DateOfAward,[DateDueForFullPayment]=@DateDueForFullPayment,[PurchasePrice]=@PurchasePrice,[ReAppraisedValue]=@ReAppraisedValue,[AmountDue]=@AmountDue,[TotalAmountPaid]=@TotalAmountPaid,[AmountUnpaid]=@AmountUnpaid,[PropertyRemarks]=@PropertyRemarks WHERE [PropertyID]=@PropertyPayorID ", conn)
            With comm
                With .Parameters
                    .AddWithValue("@PropertyPropertyID", Val(propertyPayorSessionID.ToString))
                    .AddWithValue("@PayorName", txtPayorName.Text)
                    .AddWithValue("@LotNumber", txtLotNumber.Text)
                    .AddWithValue("@LotArea", Val(txtLotArea.Text))
                    .AddWithValue("@DateOfAward", txtDateOfAward.Text.ToString)
                    .AddWithValue("@DateDueForFullPayment", txtDateOfFullPayment.Text.ToString)
                    .AddWithValue("@PurchasePrice", Val(txtPurchasePrice.Text))
                    .AddWithValue("@ReAppraisedValue", Val(txtReAppraisedValue.Text))
                    .AddWithValue("@AmountDue", Val(txtAmountDue.Text))
                    .AddWithValue("@TotalAmountPaid", Val(txtTotalAmountPaid.Text))
                    .AddWithValue("@AmountUnpaid", Val(txtAmountUnpaid.Text))
                    .AddWithValue("@PropertyRemarks", txtRemarks.Text)
                End With
                .ExecuteNonQuery()
            End With
            msg = MsgBox("Record Updated.", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "Update Payor")
        Catch myError As Exception
            MsgBox("Error: " & myError.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "Query Error")
        End Try
    Catch myError As Exception
        MsgBox("Error: " & myError.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "Connection Error")
    End Try
4

3 に答える 3

1

コードにタイプミスがあるだけです

交換

@PropertyPropertyID 

@PropertyPayorID

次に、更新ステートメントと同じようにパラメーターの順序を調整します。

そしてこれを試してください:

    Try
            Dim conn As New OleDbConnection(gConnectionString)
            If conn.State = ConnectionState.Closed Then
                conn.Open()
            End If
            Try
                  Dim comm As New OleDbCommand("UPDATE PropertiesPayors SET [PayorName]=@PayorName,[LotNumber]=@LotNumber,[LotArea]=@LotArea,[DateOfAward]=@DateOfAward,[DateDueForFullPayment]=@DateDueForFullPayment,[PurchasePrice]=@PurchasePrice,[ReAppraisedValue]=@ReAppraisedValue,[AmountDue]=@AmountDue,[TotalAmountPaid]=@TotalAmountPaid,[AmountUnpaid]=@AmountUnpaid,[PropertyRemarks]=@PropertyRemarks WHERE [PropertyID]=@PropertyPayorID ", conn)
            With comm
                With .Parameters
                    '.AddWithValue("@PropertyPayorID", Val(propertyPayorSessionID.ToString)) move this to the last part
                    .AddWithValue("@PayorName", txtPayorName.Text)
                    .AddWithValue("@LotNumber", txtLotNumber.Text)
                    .AddWithValue("@LotArea", Val(txtLotArea.Text))
                    .AddWithValue("@DateOfAward", txtDateOfAward.Text.ToString)
                    .AddWithValue("@DateDueForFullPayment", txtDateOfFullPayment.Text.ToString)
                    .AddWithValue("@PurchasePrice", Val(txtPurchasePrice.Text))
                    .AddWithValue("@ReAppraisedValue", Val(txtReAppraisedValue.Text))
                    .AddWithValue("@AmountDue", Val(txtAmountDue.Text))
                    .AddWithValue("@TotalAmountPaid", Val(txtTotalAmountPaid.Text))
                    .AddWithValue("@AmountUnpaid", Val(txtAmountUnpaid.Text))
                    .AddWithValue("@PropertyRemarks", txtRemarks.Text)
                    .AddWithValue("@PropertyPayorID", Val(propertyPayorSessionID.ToString))
                End With
                .ExecuteNonQuery()
            End With
                msg = MsgBox("Record Updated.", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "Update Payor")
            Catch myError As Exception
                MsgBox("Error: " & myError.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "Query Error")
            End Try
        Catch myError As Exception
            MsgBox("Error: " & myError.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "Connection Error")
        End Try

これで問題は解決します。

参照: OleDbCommand パラメータの順序と優先順位を参照してください。

よろしくお願いします!

于 2012-12-26T03:51:20.780 に答える
0

私の記憶が正しければ、デフォルトでは、クエリ内のプレースホルダーの名前とパラメーターの名前の間に関係はありません。BizApps が言ったように、クエリで定義されているのと同じ順序でパラメーターを配置する必要があります。PropertyPayorIDこれは、Parameters コレクションに追加するときに最後に来る必要があることを意味します。Parameters コレクションの名前は、ローカルでのみ使用されます。個々のパラメーターのいくつかのプロパティを変更する場合などです。

また、クエリ文字列で名前付きパラメーターをプレースホルダーとして使用できるかどうか、または?代わりに a を使用する必要があるかどうかも覚えていません。何かのようなものUpdate PropertiesPayors SET [PayorName]=?, ...

于 2012-12-26T05:17:20.813 に答える
0

コマンド ステートメント .ExecuteNonQuery は、影響を受けた行の数を返します。

これは、使用した場合...

intRowsAffected = .ExecuteNonQuery()

また、変数 intRowsAffected に返される値はゼロ (0) でした

次に、フィールド PROPERTYID (パラメータ コレクションに渡した値... PROPERTYPAYORSESSIONID) に同じ値を持つレコードが存在しないことを意味します。

そのため、エラーが発生せず、データベースも更新されていません。

これを再確認するには... コードステートメント .EXECUTENONQUERY() の場所...

次のものに置き換えることができます...

intRowsAffected = .ExecuteNonQuery()
Messagebox(intRowsAffected & " Data rows were updated.")

メッセージボックスにゼロ行が更新された (行が更新されていない) と表示された場合、次のステップは手動でデータベースをチェックし、行が実際に存在するかどうか、および行の識別に使用しているのと同じキー値があるかどうかを確認することです。 property-payor-session-id だと思います。

また、セッション ID はセッションごとに変化する傾向があり、常に静的ではないことに注意してください。

于 2012-12-28T15:29:16.507 に答える