2011-04-21 2 views
0

Ce qui suit est d'un adaptateur de données générées:questions sur SQL Generata (ADO.NET) DataAdapter (UpdateCommand)

this._adapter.UpdateCommand.CommandText = @" 
    UPDATE [dbo].[Currency2] SET [cid1] = @cid1, [cid2] = @cid2, [m] = @m 
    WHERE (([id] = @Original_id) 
    AND ([cid1] = @Original_cid1) 
    AND ([cid2] = @Original_cid2) 
    AND ([m] = @Original_m)); 

    SELECT id, cid1, cid2, m 
    FROM Currency2 
    WHERE (cid1 = @cid1) AND (cid2 = @cid2) AND (id = @id)"; 
  1. Est-ce la clause where mise en œuvre par la concurrence optimiste définition formelle?

  2. Ma meilleure estimation est que le but du SELECT est de retourner le nombre de lignes mises à jour, mais pourquoi n'utilise-t-il pas COUNT (*)?

Mise à jour: Voici le code UPDATE généré, qui m'a donné les idées sur le SELECT dans (2).

public virtual int Update(int cid1, int cid2, decimal m, int Original_id, int Original_cid1, int Original_cid2, decimal Original_m, int id) { 
    this.Adapter.UpdateCommand.Parameters[0].Value = ((int)(cid1)); 
    this.Adapter.UpdateCommand.Parameters[1].Value = ((int)(cid2)); 
    this.Adapter.UpdateCommand.Parameters[2].Value = ((decimal)(m)); 
    this.Adapter.UpdateCommand.Parameters[3].Value = ((int)(Original_id)); 
    this.Adapter.UpdateCommand.Parameters[4].Value = ((int)(Original_cid1)); 
    this.Adapter.UpdateCommand.Parameters[5].Value = ((int)(Original_cid2)); 
    this.Adapter.UpdateCommand.Parameters[6].Value = ((decimal)(Original_m)); 
    this.Adapter.UpdateCommand.Parameters[7].Value = ((int)(id)); 
    global::System.Data.ConnectionState previousConnectionState = this.Adapter.UpdateCommand.Connection.State; 
    if (((this.Adapter.UpdateCommand.Connection.State & global::System.Data.ConnectionState.Open) 
     != global::System.Data.ConnectionState.Open)) { 
    this.Adapter.UpdateCommand.Connection.Open(); 
    } 
    try { 
    int returnValue = this.Adapter.UpdateCommand.ExecuteNonQuery(); 
    return returnValue; 
    } 
    finally { 
    if ((previousConnectionState == global::System.Data.ConnectionState.Closed)) { 
     this.Adapter.UpdateCommand.Connection.Close(); 
    } 
    } 
} 

Répondre

2

Qu'est-ce que cette requête n'est, retourne le dossier mis à jour à l'application pour une utilisation future, de sorte que vous avez mis à jour l'objet en mémoire, au lieu de son état avant la mise à jour. Il s'agit essentiellement des commandes UPDATE xxx WHERE [email protected] et SELECT xxx FROM xxx WHERE [email protected] dans un aller-retour.

+0

J'ai ajouté le code de la mise à jour générée, qui appelle ExecuteNonQuery ... le SQL n'est référencé nulle part ailleurs je peux voir ... –

1

Est-ce la clause where mise en œuvre optimiste par la concurrence définition formelle?

Trier par. Il vérifie chaque colonne pour voir si quelqu'un a changé l'un d'entre eux. Si l'enregistrement a changé, il n'est pas mis à jour.

Cependant, une définition (de Wikipedia) indique que la transaction est annulée si l'enregistrement a changé. Cela ne se passe pas ici.