2017-01-04 2 views
0

Я использую хранимую процедуру базы данных для вставки в мою базу данных. Он работал нормально, но поскольку это новый год, мы создали новую базу данных, где все остается неизменным, но данные удаляются. Проблема в том, что хранимая процедура работает с старой базой данных, но не с новой.INSERT возвращает затронутые строки, но ничего не происходит

Я проверил таблицы (старые и новые), и все одинаково. Процедуры также одинаковы. Когда я его отлаживаю, он дает мне, что cmd.ExecuteNonQuery() затронул 61 строку без какой-либо ошибки, но ничего не отображается в таблице.

Почему это происходит, что я могу сделать, что искать?

Я понял, что executeNonQuery теперь дает мне -1

Вот вызов процедуры:

int selectedRowIndex = dataGridView1.SelectedCells[0].RowIndex; 

DataGridViewRow selectedRow = dataGridView1.Rows[selectedRowIndex]; 

int robaID = Convert.ToInt16(selectedRow.Cells["ROBAID"].Value); 
decimal unesenaKolicina = kolicina.Value; 

using (FbConnection con = new FbConnection(connectionString_Baza)) 
{ 
    con.Open(); 
    using (var cmd = new FbCommand("NAPRAVISTAVKU", con) 
    { 
     CommandType = CommandType.StoredProcedure 
    }) 
    { 
     cmd.Parameters.AddWithValue("@VRDOK", 33); 
     cmd.Parameters.AddWithValue("@BRDOK", brojDokumenta); 
     cmd.Parameters.AddWithValue("@ROBAID", robaID); 
     cmd.Parameters.AddWithValue("@CENA_BEZ_PDV", 0); 
     cmd.Parameters.AddWithValue("@KOL", unesenaKolicina); 
     cmd.Parameters.AddWithValue("@RABAT", 0); 
     cmd.ExecuteNonQuery(); 
    } 
    con.Close(); 
} 

А вот сама процедура:

SET TERM^; 
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 ;^


GRANT EXECUTE 
ON PROCEDURE NAPRAVISTAVKU TO "PUBLIC"; 

GRANT EXECUTE 
ON PROCEDURE NAPRAVISTAVKU TO SYSDBA; 
+0

Вы обновили строку подключения, чтобы указать на новую БД? – juharr

+0

Да, я сделал это. Протестировал его локально и на сервере – Parpil

+0

@juharr я отредактировал сообщение. Можете ли вы проверить его сейчас и сказать мне, если что-то встанет на ваш взгляд? – Parpil

ответ

2

Есть два потенциальных проблем, которые при чтении этого вопроса прыгайте в шахту.

  1. Вы обновили строку подключения в приложении C# , если не есть очень хороший шанс, что вы просто выполнения хранимой процедуры в старой БД.

  2. Ваша хранимая процедура может ссылаться на старую БД, если вы приписали что-либо со старым именем БД (и обе БД находятся на одном сервере). В этом случае вам необходимо изменить свою процедуру на префикс с новым именем базы данных.

строгом способ проверить на любой из этих вопросов было бы запросить старую БД и посмотреть, если какой-либо из последних изменений, которые вы сделали, были применены к нему. Если вы видите изменения, есть хороший шанс, что один из вышеупомянутых сценариев произошел.

+0

How вы хотите запросить старую БД, чтобы увидеть изменения, которые были применены. Я работаю над БД из нашей основной программы, которую мы используем, и в этой программе она работает нормально (кто-то другой создает эту программу) – Parpil

+0

Я отредактировал сообщение. Можете, пожалуйста, проверить это сейчас и сказать мне, если что-то встанет на ваш взгляд. – Parpil

+0

Вариант 2 невозможен с Firebird. База данных автономна и не знает о существовании другой базы данных, а доступ к другим базам данных возможен только с очень явным ['execute statement on external'] (https://www.firebirdsql.org/file/documentation/ reference_manuals/fblangref25-ru/html/fblangref25-psql-coding.html # fblangref25-psql-execstmt-onexternal). –

1

Проблема была в том, что мой файл DB был поврежден. При копировании с моего сервера (через терминал), как-то мое соединение теряется за миллисекунду, и из-за этого файла отсутствуют некоторые части или что-то в этом роде. Я пробовал копировать его еще 2-3 раза, и после третьего раза все получилось. Я не знаю, может быть, теперь другая таблица повреждена, но она работает с этими таблицами, которые мне нужны.

+0

Вы никогда не должны копировать файлы базы данных, вместо этого вы должны делать резервные копии и восстанавливать их. –

+0

Исправление: вы никогда не должны копировать файлы базы данных ПОКАЗАТЬ ПРОГРАММУ SERVER. Вполне нормально выключать все службы сервера firebird, затем копировать файлы базы данных, а затем перезапускать службы (ы). Конечно, если другие приложения будут в порядке без сервера на некоторое время. Предложение: есть два способа сделать резервную копию в FB2: GBAK и NBACKUP. В зависимости от особенностей (целей и узких мест) копирования - один может быть лучше другого. –