вопросы по SQL в сгенерированном (ADO.NET) DataAdapter (UpdateCommand) - PullRequest
0 голосов
/ 21 апреля 2011

Это из сгенерированного адаптера данных:

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. Реализует ли предложение where оптимистичный параллелизм в соответствии с его формальным определением?

  2. Мое лучшее предположение состоит в том, что цель SELECT - вернуть количество обновленных строк, но тогда почему он не использует COUNT (*)?

Обновление: вот сгенерированный код UPDATE, который дал мне идеи о SELECT в (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();
    }
    }
}

Ответы [ 2 ]

2 голосов
/ 21 апреля 2011

То, что делает этот запрос, возвращает обновленную запись обратно в приложение для будущего использования, чтобы вы обновили объект в памяти вместо его состояния перед обновлением.Это в основном команды UPDATE xxx WHERE ID=@ID и SELECT xxx FROM xxx WHERE ID=@ID за одну поездку.

1 голос
/ 21 апреля 2011

Реализует ли предложение where оптимистичный параллелизм в соответствии с его формальным определением?

В некотором роде.Он проверяет каждый столбец, чтобы увидеть, изменил ли кто-либо из них.Если запись изменилась, она не обновляется.

Однако одно определение (из Википедии) говорит, что транзакция откатывается, если запись изменилась.Этого здесь не происходит.

...