tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

Nefungující sql v datasource

před 9 lety

blacksun
Člen | 181

Ahoj,

mám následující sql dotaz, který puštěný přes mssql studio normálně proběhne:

<?php
$query = "
SELECT
 [rir].[RunInResultID] ,
 [rir].[RunInStatus],
 [rir].[RunInFailure],
 [rir].[RunInPassedShortCircuit],
 [rir].[RunInShortCircuitValue],
 [rir].[RunInPassedMotorOrientation],
 [rir].[RunInTimeGroupName],
 [rir].[RunInEnvironmentTemp],
 convert(char,[rir].[RunInTestTimeStart],120) as [RunInTestTimeStart],
 convert(char,[rir].[RunInTestTimeEnd],120) as [RunInTestTimeEnd],
 [e].[OSC] as [RunInOperatorOSC],
 [e].[Name] as [RunInOperatorName],
 [stds].[StandName] as [RunInStandName],
 [rir].[PotPresent],
 [rir].[UnitID],
 [units].[UnitBarCode] as [UnitBarCode],
 [ubcs].[ModelNumber] as [ModelNumber],
 [rir].[TestProfileID],
 [tps].[Name] as [TestProfileName]


FROM
 [tbRunInResults] rir


INNER JOIN
 [tbOperators] [ops]
 ON [rir].[RunInOperatorID] = [ops].[OperatorID]


INNER JOIN
 [vwEmployees] e
 ON [e].[EmployeeId] = [ops].[EmployeeID]


INNER JOIN
 [tbStands] stds
 ON [rir].[RunInStandID] = [stds].[StandID]


INNER JOIN
 [tbTestProfiles] tps
 ON [rir].[TestProfileID] = [tps].[TestProfileID]


INNER JOIN
 [tbUnitStatus] units
 ON [rir].[UnitID] = [units].[UnitID]


INNER JOIN
 [vwUnitBarCodes] ubcs
 ON [units].[UnitBarCode] = [ubcs].[UnitBarCode]

";

?>

, použitý v nette ve funkci přes

<?php
return new DibiDataSource($query,$this->connection);
?>

ale padá při pokusu spočítat celkový počet řádků. Laděnka hlásí chybu DibiDriverException:Query error, ale nevím, kde hledat, když po copy-paste do mssql studia to jede ok.

Díky za případné nakopnutí.

Michal

před 9 lety

David Grudl
Nette Core | 6806

Vypiš si SQL z té výjimky a zjisti, co v něm zlobí.

před 9 lety

blacksun
Člen | 181

Právě to, co jsem postnul jako ten dotaz, je to, co dostanu dole na stránce výjimky z Laděnky.. Když to odtamtud zkopíruju rovnou do sql studia, tak to normálně projde..

před 9 lety

blacksun
Člen | 181

Tak jsem zjistil, že problém nastává v případě, že select je z tabulek joinovaných s view. Pokud select nahradím view nad tou samou tabulkou, funguje to, ale pokud použiju view, kde je join na další view, nefunguje to.
Práva jsou všude nastavena ok, pod tím samým uživatelem přes management studio dotaz, který zkopíruju z laděnky jako „chybný“, bez problémů funguje.

Nenapadá někoho, v čem by mohl být problém? Řešením by bylo dotaz přepsat bez view, ale právě od toho přeci jsou, aby zjednodušily dotazy.

před 9 lety

blacksun
Člen | 181

Tak problém vyřešen. Heterogenní view je potřeba vytvářet s nastavením

SET ANSI_NULLS ON

SET ANSI_WARNINGS ON

, stejně tak se před voláním dibi selectu musí zavolat nastavení spojení v query pomocí

<?php
dibi::query('SET ANSI_NULLS ON');
dibi::query('SET ANSI_WARNINGS ON');
?>

a pak vše už funguje tak, jak by člověk očekával.

Problém jsem odhalil tak, že jsem si do mssql.php driveru dibi vložil funkci mssql_get_last_message(), která mi odhalila hlášku serveru. Bylo by možné ji zakomponovat do vyhazování výjimky, aby bylo jasné, proč chyba vznikla?

BlackSUN

před 9 lety

David Grudl
Nette Core | 6806

mssql_get_last_message() je tam.