Jag har en int-array med okänt antal värden som jag vill skicka in som urval till ett databas-anrop. Finns det något snyggare sätt att göra detta än att bygga upp sql-satsen dynamiskt? Jag känner inte till att SQL server eller access skulle stödja arrayer som parametrar. Det verkar inte gå att skicka in en kommaseparerad sträng och få den tolkad som flera int-värden på något enkelt sätt. Det blir nog till att bygga frågan dynamiskt i alla fall. Jag var mest ute efter en "snyggare" lösning som är lätt att läsa. Vad är tolkad på ett enkelt sätt? Förenklat exempel (det blir ju såhär om man använder join): Ovanstående ser OK ut. Hur skulle jag kunna deklarera den som varchar?? Jag använder ingen SP utan en vanlig sql-fråga som du ser i exemplet. Verkar vara dynamiskt bygge av sträng som gäller här, ledsen. Så här blir det isf: Jojo, men nu frågade jag hur man gör det med parameter istället, inte dynamiskt uppbyggd sql... Varför det? Anledningen är att jag tycker att det är lättare att läsa. Eftersom du använder SQL server 2005 + .Net 2.0, så har du ju nya möjligheter att skicka in XML-datatyper samt kanske Table-variabler direkt (osäker om det funkar, ska kolla på det). Jo, det finns ju en hel del möjliga lösningar. Men jag vill helst hålla mig borta från SQL Server-specifika saker ifall man skulle behöva byta databas i framtiden (även om det inte är så troligt).SqlParameter med array som indata
Jag skulle vilja göra såhär, fast det går ju inte med array som värde för parametern: SqlCommand cmd = new SqlCommand("SELECT Id, Namn FROM sKlienter WHERE Id IN(@Id)", DB.GetCon());
int[] a = { 1, 2, 3 };
cmd.Parameters.Add(new SqlParameter("@Id", a));
Använder .NET 2.0 och SQL Server 2005.
/Johan
Sv: SqlParameter med array som indata
SqlCommand cmd = new SqlCommand("SELECT Id, Namn FROM sKlienter WHERE Id IN(@Id)", DB.GetCon());
int[] a = { 1, 2, 3 };
cmd.Parameters.Add(new SqlParameter("@Id", a.Join(',')));
Kanske funkar. Har ingen utv miljö så kan inte testa :)
Om du inte vill göra det där dynamiskt så kan du istället ta emot en ,-separerad lista i en proc (eller direkt i din ad-hoc query och göra om den till en tabel som du sedan kör din in på. Prestandan är nog inte lika bra dock, men det är en vanlig lösning på problemet. Googla lite på typ int list to table eller ngt sådant så hittar du nog.
Sv: SqlParameter med array som indata
Data basmotorn tolkar parametern somm ett värde. Om @id = 5 ger det Id IN (5)
Om databasmotorn stödjer arrayer borde det väl vara något sådant här: Id IN @IdArraySv:SqlParameter med array som indata
/JohanSv: SqlParameter med array som indata
Vi skickar in semikolonsparerad data mobilt in i våra system, fungerar utmärkt.
//HåkanSv:SqlParameter med array som indata
SqlCommand cmd = new SqlCommand("SELECT Id, Namn FROM sKlienter WHERE Id IN(@Id)", DB.GetCon());
cmd.Parameters.Add(new SqlParameter("@Id", "1,2,3"));
Får ett meddelande i stil med "kan inte konvertera '1,2,3' till int.
Hur gör du? Jag vill alltså skicka in det via en parameter om det går.
/Johan
Sv: SqlParameter med array som indata
Verkar vara något annat.
Hur är @Id deklarerad?
Hur är mottagande parameter deklarerad som?
Deklarera dem som varchar.
Testa (något modifierad):
SqlCommand cmd = new SqlCommand("SELECT Id, Namn FROM sKlienter WHERE Id IN @Id", DB.GetCon());
cmd.Parameters.Add(new SqlParameter("@Id", "(1, 2, 3)"));
//HåkanSv:SqlParameter med array som indata
Ditt förslag ger felaktigt syntax i SQL-satsen.
/JohanSv: SqlParameter med array som indata
Om inte någon annan hacker har en lösning.
Missuppfattade lite hur du ville jobba.
//HåkanSv:SqlParameter med array som indata
IDList = "1,2,3,4,5,6,7,8,9"
sql = "SELECT Id, Namn FROM sKlienter WHERE Id IN (" & IDList & ")"Sv: SqlParameter med array som indata
Sv:SqlParameter med array som indata
Men ok då:
<code>
SqlCommand cmd = new SqlCommand("exec ('SELECT Id, Namn FROM sKlienter WHERE Id IN(' + @Id + ')')",
cmd.Parameters.Add(new SqlParameter("@Id", "1,2,3"));
</code>
;-)
Bättre med en Stored Proc,isf.
Finns även möjlighet att skicka in XML.
Regelrätta arrayer kan man inte skicka in.Sv: SqlParameter med array som indata
Men det där är ju en lösning som enligt mig blir lite "renare", kanske ska göra så istället.
/JohanSv:SqlParameter med array som indata
Men läs mer om nyheterna i ADO.NET 2/SQL 2005 så kanske du hittar nåt skoj! (Dela gärna med dig i.s.f.. :))Sv: SqlParameter med array som indata
/Johan