Autor | Zpráva | ||
---|---|---|---|
Fibi Profil |
#1 · Zasláno: 24. 10. 2017, 09:10:06
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')); 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 |
#2 · Zasláno: 24. 10. 2017, 10:33:08
Neudělá nějaký z těch triggerů rollback?
|
||
TomášK. Profil * |
#3 · Zasláno: 24. 10. 2017, 11:07:03
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 |
#4 · Zasláno: 25. 10. 2017, 08:26:30
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 * |
#5 · Zasláno: 26. 10. 2017, 12:19:26
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 |
#6 · Zasláno: 26. 10. 2017, 12:51:49
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 |
#7 · Zasláno: 26. 10. 2017, 21:17:12
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 |
#8 · Zasláno: 26. 10. 2017, 21:27:23
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 |
#9 · Zasláno: 26. 10. 2017, 22:59:58
WordpressKokos:
Nemůže použít mysqli_query, protože používá Microsoft SQL Server nikoliv MySQL. |
||
Fibi Profil |
#10 · Zasláno: 27. 10. 2017, 07:57:19
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 |
#11 · Zasláno: 27. 10. 2017, 08:58:09
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 |
#12 · Zasláno: 27. 10. 2017, 10:20:43
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')"); var_dump(sqlsrv_rows_affected($navrat)) : int(0)
Struktura tabulky: www.dropbox.com/s/zdwywxvye3zbhzf/tabulka.sql?dl=0 |
||
TomášK Profil |
#13 · Zasláno: 27. 10. 2017, 11:53:11
Do
sqlsrv_connect jde podstrčit TraceOn a TraceFile . Nevypíše se něco tam?
|
||
Kajman Profil |
#14 · Zasláno: 27. 10. 2017, 12:41:11
Zkuste přidat do insertu sloupec StiTS.
|
||
Fibi Profil |
#15 · Zasláno: 27. 10. 2017, 14:59:29
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 |
||
Časová prodleva: 6 let
|
0