Problém s připojením k MSSQL na Azure
- H0w4rd
- Člen | 96
Neřešil jste prosím někdo připojení k MSSQL na Azure přes sqlsrv?
Kámen úrazu spočívá asi v tom, že prý na Azure MSSQL se nedá nastavit u uživatelů defaultní databáze a tudíž v dotazech musím uvádět název schématu.
Pokud v Repository třídě udělám $this->context->table(‚tabulka‘), dostanu chybu od databáze
SQLSTATE[42S02]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid object name ‚tabulka‘.
protože do databáze se pošle dotaz
SELECT * FROM tabulka
který nefunguje, musel by tam být název schématu.
Pokud však udělám $this->context->table(‚schema.tabulka‘), dostanu chybu od Nette
Table ‚schema.tabulka‘ does not exist
Nepomůže ani uvést název databáze, ani dát tabulky do hranatých závorek – $this->context->table(‚[schema].[tabulka]‘)
Table ‚[schema].[tabulka]‘ does not exist
V neonu to vypadá takhle:
dsn: ‚sqlsrv:server=xxxyyyzzz.database.windows.net;database=DATABAZE‘
user: USER
password: „PASSWORD“
Pokud si mimo Nette vytvořím instanci PDO a uvedu tam ty samé údaje, připojení se vytvoří, mohu posílat dotazy se schématem a funguje to
$stmt = $db->prepare(„SELECT * FROM schema.tabulka“);
Nette database si zřejmě validuje název tabulky a:
- při tabulka to validací projde, ale z databáze se vrátí error, protože chybí název schématu
- při čemkoliv jiném to validací neprojde, nette vrátí chybu a do databáze se to ani nedostane
Jak tohle vyřešit?
- boschcb
- Gold Partner | 3
Vyřešit se to bude muset až aktualizací sqlsrv driveru nette/database. V tuhle chvíli ten driver vůbec nebere schéma v potaz a když si stahuje seznam tabulek databáze, tak to vrátí bez schémat. Myslím, že to bude fungovat, pokud budeš používat pouze schéma dbo. Pokud chceš používat nette/database a používáš schémata, tak pak jedině přes metodu „query“ a psát si dotaz sám, v takovém případě to totiž nestahuje strukturu databáze a funguje to.
- Michal Kumžák
- Člen | 106
Nepoužívám sice MSSQL na Azure, ale taky používám schemata a píšu to prostě v klasickém SQL, např.:
$this->helios->query("UPDATE dbo.TabZakazka SET Ukonceno=0 WHERE ID=?", $this->commissionId);
Možná to budeě potřebovat, tak to sem dám. Problém sem měl s voláním procedur a zpětným získáním hodnot. To sem nakonec vyřešil tím, že jsem si z připojení vytáhl PDO a řešil to přímo PDO metodama, např.:
$sql = "EXEC dbo.hp_InsertHlavickyOZ @Ident=?, @Sklad=?, @DruhPohybu=?, @RadaDokladu=?, @Insert=?, @IDPosta=?,
@Mena=?, @CisloOrg=?, @DatumPorizeni=?";
try {
$pdo = $this->helios->getPdo();
$stmt = $pdo->prepare($sql);
$this->invoiceId = (int)$this->invoiceId;
$ident = &$this->invoiceId;
$stmt->bindParam(1, $ident, \PDO::PARAM_INT|\PDO::PARAM_INPUT_OUTPUT, 20);
$stmt->bindParam(2, $sklad);
$stmt->bindParam(3, $druhpohybu);
$stmt->bindParam(4, $radadokladu);
$stmt->bindParam(5, $insert);
$stmt->bindParam(6, $posta);
$stmt->bindParam(7, $mena);
$stmt->bindParam(8, $org);
$stmt->bindParam(9, $datum);
$stmt->execute();
$stmt = NULL;
} catch (\PDOException $e) {
$this->helios->rollBack();
die('Chyba při vkládání faktury: '.$e->getMessage());
}