2016-08-09 9 views
0

私はVB.netコーディングが新しく、Do While OleDbDataReader.Readループを介してテーブルの列を読み取ってテーブルのすべての行をループし、列を更新するコードを設計しましたmontどこがゼロではないですか?Do While OleDbDataReader.Readループを使用するとアクセステーブルが更新されない

コードがエラーなしで実行されているが、私は変更を確認するために、テーブルを開いたときに我々は

tempMontComputer (Integer) 

て値を渡した場合、彼らはすなわち、そこではありません。しかし、私は直接SQLに値を配置した場合クエリつまり代わりの値が格納されている

SET mont = @mont 

使用

SET mont = 55 

を使用し、テーブルが更新されます。

表の列で構成

  • emp_id(テキスト)
  • emp_name(テキスト)
  • emp_comp_amt(番号)
  • installment(番号)
  • mont(番号)

これは私のコードです:OLEDBパラメータで

Imports System.Data 
Imports System.Data.OleDb 
Imports System.IO 

Public provider As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source =" 
Public databasepath As String = Application.StartupPath & "\EMPLOYEES.accdb" 
Public connString As String = provider & databasepath 
Public myConnection As OleDbConnection = New OleDbConnection 

Public cmdUpdateAdvCompu As New OleDbCommand 
Public DRAdvComputer As OleDbDataReader 
Public tempMontComputer As Integer 

Private Sub frmCalculateData_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
    myConnection.ConnectionString = connString 
    myConnection.Open() 

Dim commandAdvComputer As New OleDbCommand("SELECT * FROM adv_computer", myConnection) 
DRAdvComputer = commandAdvComputer.ExecuteReader() 

Do WhileDRAdvComputer.Read 
    If DRAdvComputer.Item("emp_comp_amt") <> 0 And DRAdvComputer.Item("mont") <> 0 Then 
      nscd_emp_comp_adv = DRAdvComputer.Item("emp_comp_amt")/DRAdvComputer.Item("installment") 
      tempMontComputer = DRAdvComputer.Item("mont") - 2 
      cmdUpdateAdvCompu.CommandText = "UPDATE adv_computer SET mont = @mont WHERE emp_id = @ID" 
      cmdUpdateAdvCompu.Parameters.AddWithValue("@ID", DRAdvComputer.Item("emp_id")) 
      cmdUpdateAdvCompu.Parameters.AddWithValue("@mont", tempMontComputer) 
      cmdUpdateAdvCompu.CommandType = CommandType.Text 
      cmdUpdateAdvCompu.Connection = myConnection 
      cmdUpdateAdvCompu.ExecuteNonQuery() 
    End If 
Loop 

cmdUpdateCheckDate.Dispose() 
cmdUpdateAdvCompu.Dispose() 
myConnection.Close() 

End Sub 

答えて

0

は、その名前ではなく、その位置によって認識されません。
@montパラメータの前に@IDパラメータを追加すると、パラメータプレースホルダに適用すると2つの値が交換されます。これにより、コードが@IDパラメーターの値でモントフィールドを設定しようとする不正な照会が行われ、WHEREステートメントで使用されるIDフィールドが値@montパラメーターで設定されます。だからあなたは何も更新しない、あるいは偶然に間違ったレコードを更新する。

Do WhileDRAdvComputer.Read 
    If DRAdvComputer.Item("emp_comp_amt") <> 0 And DRAdvComputer.Item("mont") <> 0 Then 
      nscd_emp_comp_adv = DRAdvComputer.Item("emp_comp_amt")/DRAdvComputer.Item("installment") 
      tempMontComputer = DRAdvComputer.Item("mont") - 2 
      cmdUpdateAdvCompu.CommandText = "UPDATE adv_computer SET mont = @mont WHERE emp_id = @ID" 
      cmdUpdateAdvCompu.Parameters.AddWithValue("@mont", tempMontComputer) 
      cmdUpdateAdvCompu.Parameters.AddWithValue("@ID", DRAdvComputer.Item("emp_id")) 
      cmdUpdateAdvCompu.CommandType = CommandType.Text 
      cmdUpdateAdvCompu.Connection = myConnection 
      cmdUpdateAdvCompu.ExecuteNonQuery() 
    End If 
Loop 
+0

どうもありがとうスティーブ:

ちょうどパラメータの順序を逆に。それは本当に働いた。 –

+0

助けになるのはうれしいです。あなたは比較的新しいユーザーであるので、私は[回答を受け入れる方法はどういう]を読むことをお勧めします(http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – Steve

関連する問題