Использование обновления в хранимой процедуре Firebird, но данные не меняются - PullRequest
2 голосов
/ 22 сентября 2011

У меня есть следующая хранимая процедура.Я нашел ошибку в моем коде, которая привела к неверным данным.Я написал эту процедуру для исправления данных.

CREATE OR ALTER PROCEDURE RESET_DISABLED_COUNT 
returns (
    person integer,
    game integer,
    disabled integer,
    cnt integer)
as
begin
  for select gr.person_id, gr.game_id, gr.disableds
  from game_roster gr
  into :person, :game, :disabled
  do begin
    select count(gr.id)
    from game_roster gr
    where gr.disabled_by_id = :person and gr.game_id = :game
    into cnt;

    if (cnt <> disabled) then begin
        update game_roster gr set gr.disableds = :cnt where (gr.person_id = :person) and (gr.game_id = :game);
    end
  end
end

Затем я запускаю процедуру из IBExpert и фиксирую.Однако когда я запускаю запрос к таблице, он показывает, что старые данные все еще там.Чего мне не хватает?

Ответы [ 3 ]

1 голос
/ 22 сентября 2011

1) Могут ли Cnt и Disabled переменные содержать значения NULL?Если это так, измените условие для

if (:cnt IS DISTINCT FROM :disabled) then ...

2) Убедитесь, что вы совершаете транзакцию после запуска SP.

3) Убедитесь, что транзакция, для которой вы выбираете данные, являетсяне SNAPSHOT транзакция.Если это так, передайте и снова откройте его перед выполнением запроса SELECT.

4) Перепроверьте логику вашей процедуры.

5) Запускаете ли вы свою процедуру в отладчике IBExpert?

1 голос
/ 29 ноября 2013

Если вы используете C # и ado, этот фрагмент будет удобен. Работает с файлом в Firebird 1.5. Usp UPDATE_stuff был типичным обновлением или вставкой типа proc, который вы воспринимаете как само собой разумеющееся в MSSQL. Это позволит вам использовать хранимую процедуру и фактически сохранить данные и сэкономить недели потерянного времени. Config.DB4FB.Open - это просто вложенный класс, который открывает новый FbConnection с необязательной строкой соединения, потому что, если вы используете firebird, вам нужно убрать всю скорбь, убранную:)

FbTransaction FTransaction=null;
using (FbConnection conn = Config.DB4FB.Open(ConnectionString))
{
    FbTransactionOptions options = new FbTransactionOptions();
    options.TransactionBehavior = FbTransactionBehavior.NoWait;
    FTransaction = conn.BeginTransaction(options);
    FbCommand cmd = conn.CreateCommand();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "UPDATE_stuff";
    cmd.Parameters.AddWithValue("KEY", key);
    cmd.Transaction = FTransaction;
    FbDataReader reader = cmd.ExecuteReader()
            while (reader.Read()){}
    FTransaction.Commit();
}
0 голосов
/ 22 сентября 2011

Вам нужно вернуть 4 выходные переменные, которые вы установили?

Если вам НЕ нужны возвращаемые значения, это то же самое, и "должно" работать

CREATE PROCEDURE RESET_DISABLED_COUNT
AS
declare person integer;
declare game integer;
declare disabled integer;
declare cnt integer;

begin
  for select gr.person_id, gr.game_id, gr.disableds
  from game_roster gr
  into :person, :game, :disabled
  do begin 
    select count(gr.id)
    from game_roster gr
    where gr.disabled_by_id = :person and gr.game_id = :game
    into cnt;
    if (cnt <> disabled) then begin
        update game_roster gr set gr.disableds = :cnt where (gr.person_id = :person) and (gr.game_id = :game);
    end
  end
end
...