Autor Zpráva
Fibi
Profil
Prosím o pomoc, nedaří se mi provést INSERT do tabulky pomocí funkce sqlsrv_query.
Volání:
sqlsrv_query($this->spoj, 'INSERT INTO tabulka (pole) VALUES ('hodnota'));
Jen pro příklad, originální dotaz je delší :-)
Nevrátí se žádná chyba, ale data v příslušené tabulce v management studiu nevidím.
Nejhorší je, že ten samý přístup mi při zapisování do jiných tabulek ve stejné databázi, se stejným přihlášením normálně funguje.
Když ten insert vezmu do management studia kam se hlásím stejným loginem také to projde bez potíží.
Jediný rozdíl, že zápis do této tabulky trvá déle, protože spouští řadu triggerů.
Zkoušel jsem hledat nějaký timeout, ale nikde nic default je bez tomeoutu. Testoval jsem i variantu že jsou v insertu jen otaníky a data v poli params a také nic.
Funkce sqlsrv_errors(SQLSRV_ERR_ALL) nic nehlásí.
Už fakt nevím jak na to.
Kajman
Profil
Neudělá nějaký z těch triggerů rollback?
TomášK.
Profil *
Není potřeba COMMIT? Pokud insert do jiných tabulek funguje, tak spíš ne, ale mohl ses na to dívat zevnitř transakce.
Fibi
Profil
Kdyby nějaký trigger udělal rollback, tak by se to dělo i přímo v management studiu ne ?
A transakce, jsou vůbec zvláštní.
Pokud před tím insertem zkusím spustit transakci BEGIN TRANSACTION, tak mi server vrátí chybu "A transaction that was started in a MARS batch is still active at the end of the batch. The transaction is rolled back."
A pokud po insertu pošlu COMMIT tak zase dostanu "The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION"
TomášK.
Profil *
K BEGIN TRANSACTION musí existovat COMMIT, jinak se při uzavření batche proběhne rollback. Pokud to není spárované, objeví se jedna z výše uvedených chyb. Myslím si, že už budeš mít na zpracování požadavku BEGIN TRANSACTION a na konci COMMIT, pak mi to hlášky dávají smysl.

Pokud uděláš těsně za tím insertem SELECT pole FROM tabulka, vidíš vložený řádek?
Kajman
Profil
Fibi:
Kdyby nějaký trigger udělal rollback, tak by se to dělo i přímo v management studiu ne ?
Pokud nekouká na kontext spuštění, tak to asi ano.

A nemůže dělat rollback ta php aplikace?
Fibi
Profil
TomášK.:
To je právě to, přeně to dělám. Zapíšu a hned na dalším řádku se dívám a nic, vrátí mi to že tam data nejsou.
Prostě záhada.
Kdyby to nějak nadávalo, házelo chybu nebo tak něco, ale nikde nic ticho po pěšině.
Nejvíc mě dostává že v tom samém scriptu zkouším zapsat do jiné tabulky a bez potíží.
A že by dělal rollback ta aplikace ?
To asi ne, já už to mám ve fázi, že v tom scriptu mám jen ty testovací příkazy na vložení dat :-)
WordpressKokos
Profil
Já jsem začátečník tak sem přihodím jen mé dva centy. Proč nepoužíváš mysqli_query?

Nemáš tento kód daný někde v if příkazu a tak se nespouští? stalo se mi to hodněkrát :D
Slark
Profil
WordpressKokos:
Nemůže použít mysqli_query, protože používá Microsoft SQL Server nikoliv MySQL.
Fibi
Profil
jj připojuji se k MS SQL, s MySQL (potažmo MariaDB) jsem nikdy takový problém neměl.
A žádná podmínka za to nemůže, už jsem v klasickém stádiu Murphyho zákonů o programování, kdy mám v programu jen jeden řádek a ten je chybný :-)
Jediné co jsem zatím zjistil, že návrat z té funkce sqlsrv_query je bool hodnota false. To ovšem poněkud podivně platí i když se insert zdaří. jak jsem psal do jiné tabulky v té samé DB to totiž jde.
Také je zajímavé, že když ten záznam do DB zapíšu v management studiu bez hodnot (jak to jen DB umožní) a následně z PHP udělám update toho záznamu tak tam zapíše vše bez potíží.
Kajman
Profil
Můžete sem poslat celý insert, strukturu tabulky a hodnotu, co vrátí sqlsrv_rows_affected? Dotaz nejlépe přepsaný na variantu s otazníky a polem parametrů.
Fibi
Profil
Kajman:
Co zhruba spouštím:
$spojka = sqlsrv_connect($stroj, array( "Database"=>$database, "UID"=>$uzivatel, "PWD"=>$heslo, "CharacterSet" => "UTF-8"));
$navrat = sqlsrv_query($spojka, "INSERT INTO StoItem (StiHide, StiHideI, StiPL, StiYSitId, StiXSiuId, StiTaxId, StiCutId, StiXSisId, StiCBy, StiUBy, StiWar, StiSL, StiLossAgree, StiSalePerm, StiOrdVen, StiOrdCus, StiOrdCusI, StiNonMater, StiNonDivQty, StiPartNo, StiCode, StiName, StiPLName, StiPLNote) VALUES (0, 0, 1, 0, 0, 10, 94, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 'FIBI001', 'test FIBI001', 'a', 'a', 'a')");
Výstup z var_dump(sqlsrv_rows_affected($navrat)) : int(0)

Struktura tabulky: www.dropbox.com/s/zdwywxvye3zbhzf/tabulka.sql?dl=0
TomášK
Profil
Do sqlsrv_connect jde podstrčit TraceOn a TraceFile. Nevypíše se něco tam?
Kajman
Profil
Zkuste přidat do insertu sloupec StiTS.
Fibi
Profil
Zkusil jsem obojí, jak ten TraceOn tak to StiTS.
StiTS - tam mi to nadává takto: Cannot insert an explicit value into a timestamp column. Use INSERT with a column list to exclude the timestamp column, or insert a DEFAULT into the timestamp column.
A když jsem zkusil do connectu ten TraceOn tak v logu vidím toto, ale nejsem z toho moc moudý:
httpd           1794-41c    ENTER SQLExecDirectW 
        HSTMT               0x037DD1A0
        WCHAR *             0x03C75000 [      -3] "INSERT INTO StoItem (StiHide, StiHideI, StiPL, StiYSitId, StiXSiuId, StiTaxId, StiCutId, StiXSisId, StiCBy, StiUBy, StiWar, StiSL, StiLossAgree, StiSalePerm, StiOrdVen, StiOrdCus, StiOrdCusI, StiNonMater, StiNonDivQty, StiPartNo, StiCode, StiName, StiPLName, StiPLNote) VALUES (0, 0, 1, 0, 0, 10, 94, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 'FIBI001', 'lampa o FIBI001', 'a', 'a', 'a')\ 0"
        SDWORD                    -3

httpd           1794-41c    EXIT  SQLExecDirectW  with return code 100 (SQL_NO_DATA_FOUND)
        HSTMT               0x037DD1A0
        WCHAR *             0x03C75000 [      -3] "INSERT INTO StoItem (StiHide, StiHideI, StiPL, StiYSitId, StiXSiuId, StiTaxId, StiCutId, StiXSisId, StiCBy, StiUBy, StiWar, StiSL, StiLossAgree, StiSalePerm, StiOrdVen, StiOrdCus, StiOrdCusI, StiNonMater, StiNonDivQty, StiPartNo, StiCode, StiName, StiPLName, StiPLNote) VALUES (0, 0, 1, 0, 0, 10, 94, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 'FIBI001', 'lampa o FIBI001', 'a', 'a', 'a')\ 0"
        SDWORD                    -3

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0