У меня есть хранимая процедура, которая выглядит следующим образом (не читайте ее, так как 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 #?