Diskuze: SqlDataReader a dva SELECTy
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 6 zpráv z 6.
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj,
já raději odladím SQL kód v manageru, třeba jako testovací uloženou proceduru, kterou bych si tam spouštěl. Určitě
by se ten kód zjednodušil a ve výsledku asi i zrychlil.
Nevím, jaké je zadání, ale řekl bych, že ten vnořený select má být přímo součástí prvního selectu, takže výsledkem by mohl být z pohledu C# jediný SQL-příkaz, třeba takto:
SELECT EndHdTicketId
FROM TicketRelation TR
JOIN tHdTicket T ON T.iHdTicketId = TR.EndHdTicketId
WHERE TR.TicketRelationTypeId = 2
AND T.dHdTicketResolved IS NULL
AND TR.BeginHdTicketId =
(
SELECT BeginHdTicketId
FROM TicketRelation TR
JOIN tHdTicket T ON T.iHdTicketId = TR.BeginHdTicketId
WHERE TR.TicketRelationTypeId = 2
AND T.dHdTicketResolved IS NULL
AND TR.EndHdTicketId = @iHdTicketId
);
A doporučuju zkusit ten SQL Manager
Napsat SQL příkaz takhle natvrdo rovnou do inicializace commandu je docela drsné, ale když ti to vyhovuje...
Ale k problému:
Jinak jsem přesvědčený, že pokud nepotřebuješ parentTicketId k nějakým dalším věcem v kódu, tak by z těch dvou volání SQL šlo udělat jediné vracející rovnou cílový seznam.
Ahoj, nevím přesně kde má být chyba...
Znamená to, že ti první select nevrátí hodnotu, nebo že ti proběhne
druhý select špatně a nevloží se ti správně hodnota z prvního
selectu?
Nehlási ti náhodou překladač chybu na řádku
if (parentTicketId != null)
???
Máš tam totiž neinicializovanou proměnou typu int, která musí mít vždy hodnotu. Změň si deklaraci z
int parentTicketId;
na
int? parentTicketId = null;
nebo
int parentTicketId = 0;
// a pak testuj jestli je != 0 namísto null
Typ int (Int32) je totiž non nullable typ, tzn. že musí mít hodnotu. Typ int? - ten otazník je důležitý,obalí typ a přidá možnost mít null u non nullable typů... vnitřní struktura je pak trochu odlišná, přidá vlastnost HasValue (má/nemá hodnotu) a Value - Value je pak hodnota původního typu, v tomto případě int (při pokusu o přístup k hodnotě, která je null, vyhodí exception)
Dekuji vsem za rady. Jednotlive selecty mam otestovane a vraci, co maji. Jen mi to nejde spojit, tj. vysledek prvniho vlozit do podminky druheho. Urcite zitra vyzkousim upravit deklaraci promenne a priradit ji hodnotu 0. Pokud to nepomuze, zamyslim se nad spojenim obou selectu. Jinak to asi nepujde... Dam vam vedet, jak to dopadlo. A jeste jednou dekuji za ochotu.
Zobrazeno 6 zpráv z 6.