Avatar billede pablopablo Nybegynder
06. september 2006 - 00:56 Der er 18 kommentarer og
1 løsning

Dynamisk sql statement

Hey...

Som I ved kan man gøre dette:

SELECT *
FROM tabel
WHERE (Kolonne = @Værdi)

Men hvordan gør man også kolonnen navnet til en variable, som man kan angive via indparametre til proceduren eller select-metoden?

Hár prøvet med:

WHERE (@Kolonne = @Værdi)

Men det fungerer ikke, den forsår simpelthen ikke, at det er en kolonne...

Håber meget I kan hjælpe!

Mvh. PabloPablo
Avatar billede arne_v Ekspert
06. september 2006 - 01:16 #1
det kan man ikke
Avatar billede pablopablo Nybegynder
06. september 2006 - 01:31 #2
var?? det kan da ikke være rigtig??

Jeg sidder og arbejder med VS 2005 og asp.net 2.0...og de lægger op til når man bruger et typed dataset og en adapter, at man opretter metoder/procedurer...
og det er derfor jeg sprøger...fordi det kunne man jo let via den ældre metode ...string sql = "SELECT * FROM tabel WHERE "+kolonne+" = '"+værdi+"'";

Hvis jeg har bare 10 stk kolonner og fx. skal sammen ligne to tilfældige kolonner med to tilfældige værider...er det jo 10^2 = 100 metoder jeg skal oprette ...og det giver jo ingen mening...??

Så der skal man altså stadig bruge den gamle måde eller...? gik ud fra at man kunne det samme med det nye nemlig...
Avatar billede arne_v Ekspert
06. september 2006 - 01:54 #3
du skal nok lade kolonnen være inline string og værdien være parameter
Avatar billede arne_v Ekspert
06. september 2006 - 02:07 #4
de klassiske argumenter for at bruge parameter:
  undgå single quote problemer
  undgå dato format problemer
burde heller ikke være et problem med kolonne navne
Avatar billede pablopablo Nybegynder
06. september 2006 - 02:30 #5
sorry...men forsod ik dit svar: "du skal nok lade kolonnen være inline string og værdien være parameter"...?

kan du forklare det lidt mere detaljeret de ang. kolonnen? kan man så godt lave en metode Select metode/procedure som tager et eller flere kolonnenavne og værdier som inparameter...?
Avatar billede arne_v Ekspert
06. september 2006 - 02:33 #6
jeg antager at du koder i .NET

:-)

SqlCommand cmd = new SqlCommand("SELECT * FROM tabel WHERE (" + Kolonne + " = @Værdi");
Avatar billede arne_v Ekspert
06. september 2006 - 02:33 #7
hvis det er en stored procedure så skal du kigge på EXEC kaldet
Avatar billede pablopablo Nybegynder
06. september 2006 - 02:48 #8
yes...som jeg skrev tidligere...asp.net 2.0 ...
ooh, dit sidste post er jeg med på... men det kan jeg da ikke bruge når jeg lave en select metode til TableAdapter objektet i VS 2005 og er tilknyttet mit typed dataset, vel...? Der ser C# kalder jo fx. således ud:

ObjectDataSource1.SelectParameters.Add("status", TypeCode.Int32, Session["status"].ToString());
ObjectDataSource1.SelectMethod = "GetDataByStatus";

og metoden GetDataByStatus (@Status) indeholder fx:

SELECT *
FROM tabel
WHERE (Status= @Værdi)

Den sidste måde du viste med parametre, er jo den måde jeg kalder den gamle måde...den kode skrives på i C# filen...

Ved ikke om det er mig, som slet ikke har forståe noget...men for mig at se, at det to helt forskellige måder at gøre det samme på...
Avatar billede arne_v Ekspert
06. september 2006 - 04:09 #9
jeg har aldrig arbejdet med typed data set, så jeg ved ikke om det kan gøres

jeg kan godt tvivle lidt
Avatar billede pablopablo Nybegynder
06. september 2006 - 04:18 #10
har du ikke det? det troede jeg da alle med forstand på tingene brugte...:D ?

Men fair nok...Jeg er ikke sql ekspert - men kan heller ikke se hvordan det kan kunne lade sig gøre...synes bare det virker underligt...idet det jo ikke er så unormalt det jeg prøver at udføre, tværtimod...
Avatar billede arne_v Ekspert
06. september 2006 - 04:50 #11
jeg tror nok at de fleste lidt gammeldags typer som mig foretrækker en type safe
collection af en data klasse
Avatar billede dr_chaos Nybegynder
06. september 2006 - 09:11 #12
du kan gøre det på database niveau med

declare sql varchar(8000)
SET sql= 'SELECT * FROM tabel WHERE'+ CONVERT(varchar(200),@Kolonne) +'= '+ CONVERT(varchar(200),@Værdi)

EXEC (sql)


Det er lavet i hånden så der kan godt være små fejl.
Avatar billede dr_chaos Nybegynder
06. september 2006 - 09:12 #13
f.eks ved at lave det i en stored procedure
Avatar billede pablopablo Nybegynder
06. september 2006 - 15:35 #14
hej igen...arne v >> hvad mener du med: "type safe collection af en data klasse" i forbindelse med dette?

dr chaos>> okay, ja det er også en mulighed jo, men alligevel noget andet end det jeg prøver på via de nye metoder i asp.net 2.0...ville jo gerne lave alt på samme måde...

Tidligere har jeg blot benyttet en DB klasse som jeg selv har kodet, den varetager så al komm. med databasen...i C# skal jeg blot vælge den ønskede metode og angive SQL'en...det har altid virket meget let...

Den nye metode i asp.net 2.0 tager lidt længere tid - men som de skriver, så finder den evt. fejl ved kompilering i stedet for runtime, hvilket jo kan spare mange for tid...

Lige nu tror jeg, at vil fortsætte på min gamle måde...hvordan foretrækker I at gøre det?

Har aldrig rigtig benyttet stored procedures...men fordelen i dem ligger i hastigheden de udføres i ik? sammenlignet med almindelig udførsel af sql som benytter...?
Avatar billede arne_v Ekspert
06. september 2006 - 16:24 #15
I.s.f. et typed data set så List<MyRecord>
Avatar billede arne_v Ekspert
05. oktober 2006 - 03:04 #16
tid at få afsluttet her ?
Avatar billede arne_v Ekspert
10. december 2006 - 00:50 #17
??
Avatar billede pablopablo Nybegynder
26. marts 2008 - 11:06 #18
bedre sent end aldrig ;) Mange tak for hjælpen! Læg venligst et svar Arne !
Avatar billede arne_v Ekspert
26. marts 2008 - 12:46 #19
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester