Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[c#/sql] Een collection als parameter toevoegen

Pagina: 1
Acties:

Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
            List<int> tickets = new List<int>();
            //voeg wat waarden toe..

            SqlCeCommand command = new SqlCeCommand(

                "UPDATE Data SET EndOfDay = 1 " +
                "WHERE Ticket IN(@tickets)"
                , _con);

            command.Parameters.Add("@tickets", SqlDbType.Int).Value = tickets;
            command.ExecuteNonQuery();


Ik wil de update uitvoeren voor een hele reeks tickets, die ik bijvoorbeeld in een array heb staan. Bovenstaande werkt natuurlijk niet omdat ik als type SqlDbType.Int aangeef. Wat is wel de juiste manier om zoiets te doen?

Verwijderd

In dit geval is 't misschien handiger om geen geparametriseerde query te gebruiken, maar 'm zelf samen te stellen. Dus een string opbouwen met alle ticket nummers, gescheiden door een komma, en die op de plaats van @tickets zetten.
Kans op SQL injection is 0,0 omdat je een List<int> als aanvoer gebruikt, en performance zal 't ook niet echt kosten (dagafsluiting doe je meestal 1x per 24 uur)...

Succes met je kassasysteem (neem ik aan)!

Edit: Oh ja, wanneer je lijst met tickets nogal lang is (en dat mag ik voor jou en/of je klanten hopen), gebruik dan een StringBuilder om 't IN() argument samen te stellen. Standaard string concatenation in C# is hopeloos traag vanwege 't boxing/unboxing gebeuren en omdat strrings in C# immutable zijn. Bij iedere wijziging moet de hele string dus gecopieerd worden.
Voorbeeldje: ik had een code generator gemaakt die een MSSQL database vertaalt naar een DAL, totaal 65000+ regels code. Met standaard concatenation duurde dat dik 20 minuten, met een StringBuilder 4 seconden... ;)

[ Voor 39% gewijzigd door Verwijderd op 03-03-2008 21:03 ]


Verwijderd

Topicstarter
Het is geen kassasysteem ;)

Het probleem komt eigenlijk voort uit het feit dat Sql Server Compact geen subqueries ondersteunt voor Update statements. Anders had ik op de plaats van @tickets de subquery geinsert. Ik heb wat je zegt even geprobeert en de performance is redelijk goed, het wordt daarbij ook niet zo vaak uitgevoerd.

Toch maar eens kijken naar een bijvoorbeeld Sql Server Express, de sql support van compact is te beperkt.

  • Gadgets
  • Registratie: Juni 2006
  • Laatst online: 16-11 22:52
Kijk eens naar een CTE, hiermee kun je een stukje xml meegeven in je query. Die xml kan bv alle ID's bevatten die je wilt gebruiken.

Verwijderd

My bad, bij EndOfDay denk ik automatisch aan kassa's. :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 13:42
Je kan gewoon geen parameters gebruiken in deze situatie (comma separated string).
Je zal hier dus gewoon je comma - separated string in je query moeten concatten.

Zoals Afterlife al zegt: de kans op sql injection is nihil.

https://fgheysels.github.io/

Pagina: 1