[ASP.NET] Stored Procedures aanroepen*

Pagina: 1
Acties:
  • 210 views sinds 30-01-2008
  • Reageer

  • _Rob
  • Registratie: Januari 2003
  • Laatst online: 17-04 08:49
Ik probeer al de hele dag uit de database gegevens te halen van het type text. En deze weer in een label te zetten. Maar het gaat al meteen mis bij de stored procedure. Ik ben op zoek gegaan bij diverse zoekmachines en kwam dus tot de conclusie dat die database gegevens van het type text niet als een variabel (@) kunnen (omdat er geen limiet op een text zit).

Dit is de stored procedure (die niet werkt) deze geef een foutmelding.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE Procedure NieuwsDetail
(
    @NieuwsId int,
    @Nieuws text output
)
AS
SELECT 
    @Nieuws = Nieuws
FROM 
    Nieuws
WHERE 
    NieuwsId = @NieuwsId
GO

Ik heb geen ideeen meer hoe ik dit nu het beste kan aanpakken om simpel die label te vullen, ik wil hier ook geen datagrid of list voor gebruiken maar gewoon via een public class die later teruggeroepen wordt.

Bedankt voor de ideeen _/-\o_

Webdeveloping... -counts to 10- Sigh...


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
CREATE Procedure NieuwsDetail
(
    @NieuwsId int
)
AS
SELECT 
    Nieuws
FROM 
    Nieuws
WHERE 
    NieuwsId = @NieuwsId
GO

En dan gewoon uitlezen met bv een SQLDataReader? :P

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Pas je procedure als volgt aan:
code:
1
2
3
select nieuws
from nieuws
where nieuwsid = @NieuwsId


Als je zeker bent dat die procedure altijd slechts 1 row returned, dan kan je de ExecuteScalar() method gebruiken van het SqlCommand object waarmee je de procedure aanroept.
Daarmee kan je die column dan uitlezen.

https://fgheysels.github.io/


  • _Rob
  • Registratie: Januari 2003
  • Laatst online: 17-04 08:49
In principe had wilde ik het op deze manier doen via deze class.
ASP.NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Public Class NieuwsDetail

        Public Kop As String
        Public Samenvatting As String
        Public Nieuws As String
        Public Type As String

    End Class

    Public Class NieuwsDB

        Public Function GetNieuwsDetail(ByVal NieuwsId As String) As NieuwsDetail

            ' Creeer de instantie van de connectie en het commando object
            Dim myConnection As SqlConnection = New SqlConnection(ConfigurationSettings.AppSettings("ConnectionString"))
            Dim myCommand As SqlCommand = New SqlCommand("NieuwsDetail", myConnection)

            ' Voeg parameters aan SPROC
            Dim parameterNieuwsId As SqlParameter = New SqlParameter("@NieuwsId", SqlDbType.Int, 4)
            parameterNieuwsId.Value = CInt(NieuwsId)
            myCommand.Parameters.Add(parameterNieuwsId)

            Dim parameterKop As SqlParameter = New SqlParameter("@Kop", SqlDbType.NVarChar, 255)
            parameterKop.Direction = ParameterDirection.Output
            myCommand.Parameters.Add(parameterKop)

            Dim parameterSamenvatting As SqlParameter = New SqlParameter("@Samenvatting", SqlDbType.NVarChar, 4000)
            parameterSamenvatting.Direction = ParameterDirection.Output
            myCommand.Parameters.Add(parameterSamenvatting)

            Dim parameterNieuws As SqlParameter = New SqlParameter("@Nieuws", SqlDbType.NText)
            parameterNieuws.Direction = ParameterDirection.Output
            myCommand.Parameters.Add(parameterNieuws)

            Dim parameterType As SqlParameter = New SqlParameter("@Type", SqlDbType.NVarChar, 50)
            parameterType.Direction = ParameterDirection.Output
            myCommand.Parameters.Add(parameterType)

            myConnection.Open()
            myCommand.ExecuteNonQuery()
            myConnection.Close()

            ' Creeer GebruikersDetail Structuur
            Dim myNieuwsDetail As NieuwsDetail = New NieuwsDetail()

            ' Populate Struct using Output Params from SPROC
            myNieuwsDetail.Kop = CStr(parameterKop.Value)
            myNieuwsDetail.Samenvatting = CStr(parameterSamenvatting.Value)
            myNieuwsDetail.Nieuws = CStr(parameterNieuws.Value)
            myNieuwsDetail.Type = CStr(parameterType.Value)

            Return myGebruikersDetail

        End Function


Maar dan zit ik nog steeds met dat text probleem.

Webdeveloping... -counts to 10- Sigh...


  • _Rob
  • Registratie: Januari 2003
  • Laatst online: 17-04 08:49
Excuses van het laatste bericht :x

Webdeveloping... -counts to 10- Sigh...


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Heb je uberhaupt wel de reactie van mij en whoami gelezen?

Verder vind ik het een beetje nutteloos om in dit geval een class in een class te plaatsen.

* gorgi_19 mompelt verder iets over LLBLGen..

[ Voor 59% gewijzigd door gorgi_19 op 11-06-2003 15:23 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • _Rob
  • Registratie: Januari 2003
  • Laatst online: 17-04 08:49
Ja, idd daarom mijn excuses. Dat was niet mijn bedoeling. Ben nu aan het zoeken naar ExecuteScalar() bedankt voor de reacties.

Webdeveloping... -counts to 10- Sigh...


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Pas je procedure aan zodat je slechts 1 parameter gebruikt, nl. het Id van het record dat je wilt ophalen.
In je procedure voer je dan gewoon die query uit (zie m'n eerder bericht).

In je applicatie kan je dan de resulaten van die procedure gewoon uitlezen dmv een datareader of inlezen in een DataSet.
De ExecuteNonQuery method van het Command object roep je aan als je gegevens wilt inserten/deleten/updaten; wil je gegevens uitlezen dan moet je het dus dmv een datareader of dataset doen (of ExecuteScalar als je slechts 1 waarde moet terugkrijgen).

https://fgheysels.github.io/


Verwijderd

En als je nu eens je stored procedure vergeet en gewoon "Select * From Nieuws Where NieuwsID=" & NieuwsID doet?
Het gaat mss een fractie van een milliseconde trager maar ik denk dat jij geen site hebt met 100 hits per minuut?

Dat spaart je 10 regels code (je kan al dat gedoe van addparameter weglaten).
En het is een pak leesbaarder (je sql staat op je pagina...)

myNieuwsDetail.Kop = CStr(parameterKop.Value)
myNieuwsDetail.Samenvatting = CStr(parameterSamenvatting.Value)
myNieuwsDetail.Nieuws = CStr(parameterNieuws.Value)
myNieuwsDetail.Type = CStr(parameterType.Value)

Wrm moet jij casten als je database ook in deze types staat?

Ik denk dat jij het wat te ver zoekt.
Voor zo'n simpele databasequery gebruik je te moeilijk technieken (correct me if I'm wrong).
Ik denk dat het simpeler kan (sry kzou je graag een vb geven maar ik ben eigenlijk mijn examen latijn aan het leren).

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Verwijderd schreef op 11 June 2003 @ 16:28:
En als je nu eens je stored procedure vergeet en gewoon "Select * From Nieuws Where NieuwsID=" & NieuwsID doet?
Het gaat mss een fractie van een milliseconde trager maar ik denk dat jij geen site hebt met 100 hits per minuut?
En waarom zou jij die SP willen vergeten?
Goed programmeren draait niet om in zo weinig mogelijk regeltjes code iets werkends te krijgen.
Goed programmeren gaat erom om iets zo performant, schaalbaar, onderhoudbaar en veilig mogelijk te maken.
De manier waarop jij die query zou uitvoeren is gewoon onveilig.
Dat spaart je 10 regels code (je kan al dat gedoe van addparameter weglaten).
En het is een pak leesbaarder (je sql staat op je pagina...)
Dat gedoe met die parameter zorgt er wel voor dat je SQL injection makkelijk kunt opvangen.
Verder is het gebruik maken van SP's net veel leesbaarder dan als je al je SQL code in je presentatie of business logic hebt zitten.

https://fgheysels.github.io/


Verwijderd

offtopic:
(NOFI:)
@ Whoami: Ik ga niet discussiëren maar ik vroeg mij gewoon af of de makkelijkste manier niet de beste was voor _Rob (ik heb eens even naar zijn posthistory gekeken).
Wrm is het uitvoeren van die query op mijn manier zo onveilig?
Het mooiste van al zou natuurlijk zijn moest hij alles in een webservice steken ;)

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op 11 June 2003 @ 17:03:
offtopic:
(NOFI:)
@ Whoami: Ik ga niet discussiëren maar ik vroeg mij gewoon af of de makkelijkste manier niet de beste was voor _Rob (ik heb eens even naar zijn posthistory gekeken).
Wrm is het uitvoeren van die query op mijn manier zo onveilig?
Het mooiste van al zou natuurlijk zijn moest hij alles in een webservice steken ;)
Daarom hoef je nog geen brakke oplossingen te posten. Als anderen het zien, nemen ze dit voorbeeld over en leren ze het bovendien nog verkeerd.

Eveneens vraag ik me in dit geval af wat het nut is van een webservice in dit geval? Waarom zou je die willen gebruiken hiervoor? Lijkt me eik een beetje onzinnig om een connectie te krijgen via je datalaag via een webservice.

Waarom je methodiek onveilig is? Zoek eens op SQL Injection Attacks op Google; zijn genoeg betogen over geschreven.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Ik berust: je hebt gelijk _/-\o_ , dringend mijn code gaan updaten :D

Ik doe altijd enkele simpele tests als:
If Strblabla <> "" Then
strblabla= cint(strblabla)
...
En dan krijgen ze maar een error als ze iets verkeerd invullen >:)

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op 11 June 2003 @ 17:49:
Ik berust: je hebt gelijk _/-\o_ , dringend mijn code gaan updaten :D

Ik doe altijd enkele simpele tests als:
If Strblabla <> "" Then
strblabla= cint(strblabla)
...
En dan krijgen ze maar een error als ze iets verkeerd invullen >:)
* gorgi_19 probeert te allen tijde te voorkomen dat een gebruiker een andere error krijgt dan ik op ze af stuur.. :X

Wat op zich met de validator controls een stuk eenvoudiger voor elkaar te krijgen is. :)

[ Voor 13% gewijzigd door gorgi_19 op 11-06-2003 17:51 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Hoe zittet nu eigenlijk met de topicstarter want over de veiligheid kan op zich al een topic geopend worden...

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op 11 June 2003 @ 17:55:
Hoe zittet nu eigenlijk met de topicstarter want over de veiligheid kan op zich al een topic geopend worden...
Ow ja.. De TS... ff vergeten.. 8)7

Ik had nog een opmerking gemaakt dat ik z'n code vrij ranzig vond en een beetje onzinnig..

Public vars ben ik sowieso niet zo een voorstander van (daar hebben ze properties voor uitgevonden). Verder is het een beetje gek om die SP in een aparte class in de class te zetten.

Deze structuur ben ik eerder tegen gekomen bij IBuySpy; hoewel ik de structuur daar ook niet echt om naar huis te schrijven vindt.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Misschien offtopic, maar ik stuitte op dit artikel:

Dynamically Bind Your Data Layer to Stored Procedures and SQL Commands Using .NET Metadata and Reflection

Ik heb ff vlug de summary gelezen , en het idee is om een SqlCommand object te laten genereren dat je Stored Procedure aanroept. Zo hoef je zelf die code niet meer te schrijven, en hoef je zelf die parameters enzo niet meer te adden.
Ook als je SP later veranderd, dan zal je afaik niet zoveel aanpassingen zelf moeten doen in je code, aangezien die commands gegenereerd worden.

Straks ff uitproberen. ;)

https://fgheysels.github.io/


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/// <summary>
/// Calls the specified stored procedure in the SqlServer database a newly created connection is connecting to. Fills the
/// specified datatable. 
/// </summary>
/// <param name="storedProcedureToCall">Stored procedure to call</param>
/// <param name="parameters">array of parameters to specify</param>
/// <param name="tableToFill">Datatable to fill by the stored procedure</param>
/// <returns>true if succeeded, false otherwise</returns>
public static bool CallStoredProcedure(string storedProcedureToCall, SqlParameter[] parameters, DataTable tableToFill)
{
    SqlCommand command = new SqlCommand(storedProcedureToCall, CreateConnection());
    command.CommandType = CommandType.StoredProcedure;

    SqlDataAdapter adapter = new SqlDataAdapter(command);
    for(int i=0;i<parameters.Length;i++)
    {
        command.Parameters.Add(parameters[i]);
    }
    adapter.Fill(tableToFill);

    return true;
}


aanroepen door bv:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/// <summary>
/// Calls stored procedure 'pr_CustomerOrder'.
/// </summary>
/// <param name="startOrderDate">Input parameter of stored procedure</param>
/// <param name="errorCode">Output parameter of stored procedure</param>
/// <returns>Filled Datatable with resultset of stored procedure</returns>
public static DataTable pr_CustomerOrder(DateTime startOrderDate, out int errorCode)
{
    // create parameters
    SqlParameter[] parameters = new SqlParameter[2];
    parameters[0] = new SqlParameter("@startOrderDate", SqlDbType.DateTime, 8, ParameterDirection.Input, false, 0, 0, "",  DataRowVersion.Current, startOrderDate);
    parameters[1] = new SqlParameter("@errorCode", SqlDbType.Int, 4, ParameterDirection.Output, false, 10, 0, "",  DataRowVersion.Current, null);

    // Call the stored proc.
    DataTable toReturn = new DataTable("pr_CustomerOrder");
    bool hasSucceeded = DbUtils.CallStoredProcedure("pr_CustomerOrder", parameters, toReturn);
    errorCode = (int)parameters[1].Value;

    return toReturn;
}

T is niet zo moeilijk :P

btw, die parameter create statements kun je dus ook nog in een factory gevalletje plempen. (de laatste routine (pr_CustomerOrder) is gegenereerde code, dus die hardcoded indices moet je in jouw geval dan dus nog even wat beter implementeren.)

[ Voor 31% gewijzigd door EfBe op 11-06-2003 21:35 ]

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

Pagina: 1