[MS sql + ASP.Net + c#] sorteren in een SP

Pagina: 1
Acties:

  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 29-07 17:11
Hallo,

ik ben bezig met een pagina waar een overzichtslijst te zien is van klanten. Met een aantal linkbuttons kun je de lijst sorteren bv. op bedrijfsnaam, adres, datum etc. Het leek mijn handig om mijn stored procedure in de query de ORDER BY variabel te maken zodat ik maar 1 stored procedure nodig heb. De stored procedure ziet er nu ongeveer als volgt uit:

CREATE PROCEDURE sorteerLijst
(
@sorteermodus VARCHAR
)
AS
SELECT klantnaam, bedrijfsnaam, datum FROM klanten ORDER BY @sorteermodus
GO

echter als ik deze procedure wil opslaan krijg ik een foutmelding:
The SELECT item identified by the ORDER BY number 1 contains a variable as part of the expression identifying a colomn position. VArables are only allowed when ardering by an expression referencing a colomn name.

als ik inplaats van @sorteermodus gewoon klantnaam invul doet hij het wel. Is dit een syntax probleem of is het niet mogelijk om te sorteren aan de hand van de waarde van een variabelen. @sorteermodus wordt in de code als string aangemaakt (string sorteermodus = "klantnaam")

Thanx

stp - PSN ID: stp_4


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Dat gaat niet werken, T-SQL wil een expliciete column name bij ORDER BY. Dus OF de sql handmatig aan elkaar plakken OF sorteren buiten de stored procedure dmv een DataView.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 29-07 17:11
wat bedoel je precies met sql handmatig aan elkaar plakken?
EfBe schreef op 03 October 2003 @ 12:42:
Dat gaat niet werken, T-SQL wil een expliciete column name bij ORDER BY. Dus OF de sql handmatig aan elkaar plakken OF sorteren buiten de stored procedure dmv een DataView.

stp - PSN ID: stp_4


  • cariba
  • Registratie: Februari 2003
  • Laatst online: 17-06 03:02

cariba

while(alive) {breathe();}

Dit werkt; het is niet de de ideale oplossing omdat ie altijd moet parsen.

CREATE PROCEDURE sorteerLijst
(
@sorteermodus VARCHAR
)
AS
exec sp_executesql N'SELECT klantnaam, bedrijfsnaam, datum FROM klanten ORDER BY ' + @sorteermodus
GO

life would be much easier if we had the source code.


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
cariba schreef op 03 October 2003 @ 12:49:
Dit werkt; het is niet de de ideale oplossing omdat ie altijd moet parsen.

CREATE PROCEDURE sorteerLijst
(
@sorteermodus VARCHAR
)
AS
exec sp_executesql N'SELECT klantnaam, bedrijfsnaam, datum FROM klanten ORDER BY ' + @sorteermodus
GO
IMHO kan je dan beter je SP zo maken:

code:
1
2
3
4
5
6
7
8
9
10
11
12
CREATE PROCEDURE sorteerLijst (@p_SortColumn INT)
AS
BEGIN

   CASE @p_SortColumn

       WHEN 1 : SELECT .... ORDER BY naam
       WHEN 2 : SELECT .... ORDER BY straat

   END CASE

END


Op die manier moet je SP niet iedere keer opnieuw gecompiled worden.
Niet letten op die syntax van die CASE, want die weet ik niet zo meer vanbuiten. :P

https://fgheysels.github.io/


  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 29-07 17:11
thanx gasten, bedenk met net: waarom zou ik weer allemaal queries moeten uitvoeren als ik de data reeds in een datalist heb staan. Moet vast ook een manier zijn om deze date "her te gebruiken"?

stp - PSN ID: stp_4


  • EfBe
  • Registratie: Januari 2000
  • Niet online
CASE kan alleen in een SELECT imho. Je moet een IF ELSE tree bouwen. :P

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • EfBe
  • Registratie: Januari 2000
  • Niet online
stp_4 schreef op 03 October 2003 @ 13:31:
thanx gasten, bedenk met net: waarom zou ik weer allemaal queries moeten uitvoeren als ik de data reeds in een datalist heb staan. Moet vast ook een manier zijn om deze date "her te gebruiken"?
Dat zeg ik, via een DataView object dat je maakt mbv de datatable/set waar de data instaat. Dan kun je sorteren binnen een column.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
EfBe schreef op 03 October 2003 @ 13:32:
[...]

Dat zeg ik, via een DataView object dat je maakt mbv de datatable/set waar de data instaat. Dan kun je sorteren binnen een column.
8)7
Inderdaad, dat is idd een veel betere oplossing.
Echter, je zult zowiezo een postback nodig hebben, dus dan moet je die DataSet afaik toch wel in je ViewState of Session bewaren.

[ Voor 19% gewijzigd door whoami op 03-10-2003 13:37 ]

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Vreemd, ik heb net ff gestoeid met die DataViews en die sortering enzo.

Als ik m'n DataSet in m'n Session object bewaar, dan werkt alles perfect.
Als ik m'n DataSet in m'n ViewState bewaar, dan ben ik die DataSet blijkbaar kwijt na een postback. Kunnen er geen datasets ofzo in de Viewstate bewaard worden?

https://fgheysels.github.io/


  • EfBe
  • Registratie: Januari 2000
  • Niet online
whoami schreef op 03 October 2003 @ 13:58:
Vreemd, ik heb net ff gestoeid met die DataViews en die sortering enzo.

Als ik m'n DataSet in m'n Session object bewaar, dan werkt alles perfect.
Als ik m'n DataSet in m'n ViewState bewaar, dan ben ik die DataSet blijkbaar kwijt na een postback. Kunnen er geen datasets ofzo in de Viewstate bewaard worden?
Lijkt me wel, hij wordt gewoon geserialized opgeslagen en weer gedeserialized wanneer de postback komt. Staat viewstate wel aan op die page? (en heb je dus een grote hoeveelheid bagger in je html source in de browser ?)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Yep, viewstate is enabled op m'n page.

Toch best vreemd hoor. Zo ziet m'n page_load er uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
dsData = (DataTable)Session["data"];
if( dsData == null )
{
    dsData = new DataTable();
}
                    
if( !this.IsPostBack )
{
    GetData();
    DataGrid1.DataSource = dsData;
    DataGrid1.DataBind();
}


(In de Page_Unload ga ik m'n dsData opnieuw gaan bewaren in de ViewState of Session).

Als ik klik op m'n columnheader, dan wordt de postback uitgevoerd, kom ik in m'n page_load, en blijkt dat die datatable dsData dus null is.
Als ik die bewaar in de Session, dan werkt alles perfect.

edit:
toevoeging

Blijkbaar moet er toch iets met die ViewState aan de hand zijn....
Ik bewaar nu een integer in m'n ViewState, die ik bij iedere postback ophoog, en opnieuw bewaar.
Blijkbaar wordt die integer ook niet in m'n viewstate opgeslagen, terwijl ik zeker weet dat 'enableViewState == true' is

[ Voor 21% gewijzigd door whoami op 03-10-2003 14:21 ]

https://fgheysels.github.io/


  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 29-07 17:11
weet iemand toevallig ergens goeie references te vinden over datalist en dataviews? heb op internet zitten zoeken maar kan geen duidelijk voorbeelden vinden....

stp - PSN ID: stp_4


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
stp_4 schreef op 03 October 2003 @ 15:19:
weet iemand toevallig ergens goeie references te vinden over datalist en dataviews? heb op internet zitten zoeken maar kan geen duidelijk voorbeelden vinden....
De .NET help misschien.....

Een DataView is een 'view' op een dataset/datatable.

code:
1
2
DataView dv = new DataView(aDataTable);
dv.Sort = ....


Die dataview kan je dan dus gewoon aan de DataSource van je DataList/DataGrid assignen.

https://fgheysels.github.io/

Pagina: 1