Хранимая процедура переключения параметров из-за переключения строк в коде - PullRequest
0 голосов
/ 23 июня 2018

У меня есть хранимая процедура, которая выглядит следующим образом (не читайте ее, так как 80% не относится к этому вопросу, поэтому сначала прочтите остальную ее часть):

COMMIT WORK;
SET AUTODDL OFF;
SET TERM ^ ;

/* Stored procedures */

CREATE PROCEDURE "NAPRAVISTAVKU" 
(
  "VRDOK" SMALLINT,
  "BRDOK" INTEGER,
  "ROBAID" INTEGER,
  "CENA_BEZ_PDV" NUMERIC(15, 2),
  "KOL" NUMERIC(15, 3),
  "RABAT" NUMERIC(15, 2)
)
RETURNS
(
  "OK" SMALLINT
)
AS
BEGIN EXIT; END ^


ALTER PROCEDURE "NAPRAVISTAVKU" 
(
  "VRDOK" SMALLINT,
  "BRDOK" INTEGER,
  "ROBAID" INTEGER,
  "CENA_BEZ_PDV" NUMERIC(15, 2),
  "KOL" NUMERIC(15, 3),
  "RABAT" NUMERIC(15, 2)
)
RETURNS
(
  "OK" SMALLINT
)
AS
DECLARE VARIABLE MAGACINID SMALLINT;
DECLARE VARIABLE MTID VARCHAR(10);
DECLARE VARIABLE NAZIV VARCHAR(50);
DECLARE VARIABLE TARIFAID VARCHAR(3);
DECLARE VARIABLE NABAVNACENA NUMERIC(15, 4);
DECLARE VARIABLE POREZ NUMERIC(15, 2);
BEGIN
  OK = 0;

  SELECT MAGACINID, MTID FROM DOKUMENT
  WHERE VRDOK = :VRDOK AND BRDOK = :BRDOK
  INTO :MAGACINID, :MTID;

  SELECT NAZIV FROM ROBA WHERE ROBAID = :ROBAID
  INTO :NAZIV;

  SELECT NABAVNACENA FROM ROBAUMAGACINU
  WHERE MAGACINID = :MAGACINID AND ROBAID = :ROBAID
  INTO :NABAVNACENA;

  IF (CENA_BEZ_PDV = 0) THEN BEGIN
    SELECT PRODAJNACENA FROM ROBAUMAGACINU
    WHERE MAGACINID = :MAGACINID AND ROBAID = :ROBAID
    INTO :CENA_BEZ_PDV;
  END

  SELECT TARIFAID FROM ROBA WHERE ROBAID = :ROBAID
  INTO TARIFAID;

  SELECT STOPA FROM TARIFE WHERE TARIFAID = :TARIFAID
  INTO :POREZ;

  INSERT INTO STAVKA (VRDOK, BRDOK, MAGACINID, ROBAID, VRSTA, NAZIV, NABCENSAPOR, FAKTURNACENA, NABCENABT,
              TROSKOVI, NABAVNACENA, PRODCENABP, KOREKCIJA, PRODAJNACENA, DEVIZNACENA, DEVPRODCENA, KOLICINA,
              NIVKOL, TARIFAID, IMAPOREZ, POREZ, RABAT, MARZA, TAKSA, AKCIZA, PROSNAB, PRECENA, PRENAB, PROSPROD,
              MTID, PT, TREN_STANJE, POREZ_ULAZ, DEVNABCENA, POREZ_IZ)
  VALUES (:VRDOK, :BRDOK, :MAGACINID, :ROBAID, 1, :NAZIV, 0, 0, 0, 
           0, :NABAVNACENA, :CENA_BEZ_PDV, 0, :CENA_BEZ_PDV, 0, 0, :KOL,
           0, :TARIFAID, 0, :POREZ, :RABAT, 0, 0, 0, 0, 0, 0, 0, 
           :MTID, 'P', 0, 0, 0, :POREZ);

  SUSPEND;

  /* Obrada greske */
  WHEN ANY DO
  BEGIN
    OK = -1;
    SUSPEND;
  END

END
 ^

SET TERM ; ^
COMMIT WORK;
SET AUTODDL ON;

Внутри моего кода C # я выполняю еевот так:

using (FbConnection con = new FbConnection(M.Baza.connectionKomercijalno2018))
{
    con.Open();

    using (FbCommand cmd = new FbCommand("NAPRAVISTAVKU", con))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("VRDOK", vrDok);
        cmd.Parameters.AddWithValue("BRDOK", brDok);
        cmd.Parameters.AddWithValue("ROBAID", robaId);
        cmd.Parameters.AddWithValue("CENA_BEZ_PDV", (cenaBezPDV == null) ? 0 : cenaBezPDV);
        cmd.Parameters.AddWithValue("KOL", kolicina);
        cmd.Parameters.AddWithValue("RABAT", (rabat == null) ? 0 : rabat);
        cmd.Parameters.Add("OK", FbDbType.SmallInt).Direction = ParameterDirection.Output;

        cmd.ExecuteScalar();

        int a = Convert.ToInt32(cmd.Parameters["OK"].Value);
        return Convert.ToBoolean(cmd.Parameters["OK"].Value);
    }
}

Проблема (которую я решил) состоит в том, что по какой-то причине внутри моей таблицы было переключено 2 столбца (оба я передаю): CENA_BEZ_PDV и KOL

Я била себя по голове около 3 часов, чтобы выяснить, в чем проблема.Я использовал резиновый утенок несколько раз и не мог найти логического объяснения, почему он не работает, а затем тупо внутри меня сказал, чтобы попытаться переключить 2 строки.

Поэтому перед переключением двух строк мой кодвыглядело это так:

cmd.Parameters.AddWithValue("ROBAID", robaId);
cmd.Parameters.AddWithValue("KOL", kolicina);
cmd.Parameters.AddWithValue("CENA_BEZ_PDV", (cenaBezPDV == null) ? 0 : cenaBezPDV);**
cmd.Parameters.AddWithValue("RABAT", (rabat == null) ? 0 : rabat);

А потом я переключил 2 строки, где я передаю KOL и CENA_BEZ_PDV с логикой Давайте сделаем порядок так же, как в хранимой процедуре , и поднимаем егоработал.

Кто-нибудь, пожалуйста, объясните мне, почему это произошло?Абсолютно тот же код просто поменял строки, чтобы он соответствовал порядку, как в хранимой процедуре, и это сработало.

Значит ли что-либо из этих параметров именования что-нибудь или код просто добавляет параметры в порядке параметров процедуры?

Может бытьэто не проблема Firebird или SQL, а c #?

...