2017-12-04 17 views
0

列の値が0より大きい場合は列を更新しようとしています。そうでない場合は、新しい行が挿入されます。C#でUPDATEクエリが更新されません。

UPDATEクエリはAccessで最初にテストされ、正常に動作し、C#で試してみました。

どこから探すかわかりません。どんなヘルプ/ヒント?

Reservation selection = (Reservation)lstbReservations.SelectedItem; 
connection.Open(); 

command.CommandText = @"SELECT Service_Overzicht.OverzichtID, Service.ServiceID, Service.Beschrijving, 
         IIf(Service_Overzicht.Aantal Is Null,0,Service_Overzicht.Aantal) AS Aantal, Service.Prijs, Service.Categorie 
         FROM Service LEFT JOIN (SELECT * FROM Service_Overzicht WHERE OverzichtID = [@waarde]) 
         AS OSF ON Service.ServiceID = OSF.ServiceID;"; 

command.Connection = connection; 

command.Parameters.Add(new OleDbParameter("@waarde", OleDbType.Integer)); 
command.Parameters["@waarde"].Value = selection.Reserveringsnummer; 

reader = command.ExecuteReader(); 
while(reader.Read()) 
{ 
    if(reader.GetString(2) == "Douche Muntjes") 
    { 
     if(reader.GetInt32(3) == 0) 
     { 
      command1.CommandText = @"INSERT INTO Service_Overzicht (OverzichtID, ServiceID, Aantal) VALUES (@resID, @sID, @aantal)"; 
     } 
     else 
     { 
      command1.CommandText = @"UPDATE Service_Overzicht 
            SET Aantal = @aantal 
            WHERE OverzichtID = @resID AND ServiceID = @sID"; 
     } 

     command1.Connection = connection; 

     command1.Parameters.Add(new OleDbParameter("@resID", OleDbType.Integer)); 
     command1.Parameters["@resID"].Value = selection.Reserveringsnummer; 

     command1.Parameters.Add(new OleDbParameter("@sID", OleDbType.Integer)); 
     command1.Parameters["@sID"].Value = 1; 

     command1.Parameters.Add(new OleDbParameter("@aantal", OleDbType.Integer)); 
     command1.Parameters["@aantal"].Value = nudShower.Value; 

     reader1 = command1.ExecuteReader(); 
     if(reader1.HasRows) 
     { 
      MessageBox.Show("Something went wrong!"); 
     } 
     else 
     { 
      MessageBox.Show("Services updated"); 
     } 
    } 
+0

エラーなどありますか?問題を明確にしてください。 – lucky

+0

他のUPDATEクエリでもうまく作業していたので、これもうまくいくと思います。また、私はそれのための他の方法を知っていない、これにちょっと新しい:/ –

+4

更新/挿入クエリでExecuteReaderを呼び出すだけでなく、OleDbパラメータではPOSITIONALであるという事実も問題です。クエリに表示される順序に従ってパラメータを挿入する必要があります(INSERTとUPDATEの2つの異なる方法) – Steve

答えて

2

OleDbでは、パラメータは名前を見て、その位置で検索されません。クエリに表示される順序に従って、パラメータをコレクションに配置する必要があります。

INSERTクエリのフィールドの順序を逆にすると、INSERTとUPDATEの両方に同じ順序でパラメータを挿入できます。

if(reader.GetInt32(3) == 0) 
{ 
    command1.CommandText = @"INSERT INTO Service_Overzicht 
          (Aantal, OverzichtID, ServiceID) 
          VALUES (@aantal, @resID, @sID)"; 
} 
else 
{ 
    command1.CommandText = @"UPDATE Service_Overzicht 
          SET Aantal = @aantal 
          WHERE OverzichtID = @resID AND ServiceID = @sID"; 
} 
command1.Parameters.Add("@aantal", OleDbType.Integer).Value = nudShower.Value;   
command1.Parameters.Add("@resID", OleDbType.Integer).Value = selection.Reserveringsnummer; 
command1.Parameters.Add("@sID", OleDbType.Integer).Value = 1; 
command1.Connection = connection; 

は最後UPDATE/INSERT/DELETEクエリは、ExecuteNonQueryコールを使用して実行され、行の数が変化表す戻り値を見ています。
ExecuteReaderを呼び出すと、渡されたクエリが実行されますが、返されたレコードセットを読み取るためにOleDbDataReaderを構築しようとします。
更新クエリではなく数字だけを読み取るレコードはありません。

int rows = command1.ExecuteNonQuery(); 
    if(rows != 0) 
     ....success.... 
関連する問題