Avatar billede mema Nybegynder
13. marts 2007 - 16:09 Der er 22 kommentarer og
1 løsning

Stored procedures og DataReader

Jeg har en Webform, som sender data til en Sql (2000) database. Gennem en Session sender jeg ID'et af den nysendte skema til en ny Webform. I denne Webform ville jeg gerne gennem en "stored procedure" som hedder "zMem-AntalPladser" vise værdierne som stored procedure genererer på nogle labels.

Min stor procedure ser sådan ud og det virker godt:
-----
ALTER PROCEDURE [dbo].[zMem_AntalPladser]
@TurID int,
@Titel varchar(50),
@AntalMax int,
@AntalTotal int

AS BEGIN
SELECT  dbo.Tilmelding.TurID AS id, dbo.Tur.Titel AS Turnavn, SUM(dbo.Tilmelding.AntalTotal) AS Total, MAX(DISTINCT dbo.Tur.AntalMax) AS MaxPrTur
FROM  dbo.Tilmelding INNER JOIN dbo.Tur ON dbo.Tilmelding.TurID = dbo.Tur.TurID GROUP BY dbo.Tilmelding.TurID, dbo.Tur.Titel
END
-----

I min nye webform har jeg en metode med en datareader, som skal vise data fra den "stored procedure" på nogle labels (virker IKKE):
-----
private void VisValues()
{
using (SqlConnection conTur = new SqlConnection(@"Server=GJJH\MC;Integrated Security=SSPI;database=Tilmeld"))
using (SqlCommand command = new SqlCommand("zMem_AntalPladser", conTur))       
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("@TurID", SqlDbType.Int);
command.Parameters["@TurID"].Value = Convert.ToInt32(lblTurID.Text);
command.Connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
if (reader.Read())
{
lblID.Text = reader.GetInt32(reader.GetOrdinal("TurID")).ToString();
lblTur.Text = reader.GetString(reader.GetOrdinal("Titel")).ToString();
lblMax.Text = reader.GetInt32(reader.GetOrdinal("AntalMax")).ToString();
lblTotal.Text = reader.GetInt32(reader.GetOrdinal("AntalTotal")).ToString();
conTur.Close();
}
}
}
}
------

Jeg får følgende fejl i broeseren:
Procedure 'zMem_AntalPladser' expects parameter '@Titel', which was not supplied.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Data.SqlClient.SqlException: Procedure 'zMem_AntalPladser' expects parameter '@Titel', which was not supplied.


Jeg søger hjælp ved rettelse af min metode. Kan man overhoved bruge en datareader i denne sammenhæng eller skal man bruge noget andet.
Og til sidst kan man overhovet få fat i det ny-oprettede id uden at bruge Session?
Avatar billede kalp Novice
13. marts 2007 - 16:15 #1
du skal lige kalde conTur.Open()
på din connection
Avatar billede kalp Novice
13. marts 2007 - 16:15 #2
ahh okay.. ser lige på det igen..det kommer i en lidt sjov rækkefølge synes jeg
Avatar billede kalp Novice
13. marts 2007 - 16:18 #3
Du skal lave Parameters add på alle disse

@TurID int,
@Titel varchar(50),
@AntalMax int,
@AntalTotal int

og ændre denne

using (SqlCommand command = new SqlCommand("zMem_AntalPladser", conTur))       

til

using (SqlCommand command = new SqlCommand("EXECUTE zMem_AntalPladser @TurID,@Titel,@AntalMax,@AntalTotal", conTur))
Avatar billede dr_chaos Nybegynder
13. marts 2007 - 16:20 #4
vrøvl gawi.
Problemet ligger i din stored procedure:
ALTER PROCEDURE [dbo].[zMem_AntalPladser]
@TurID int,
@Titel varchar(50),
@AntalMax int,
@AntalTotal int

AS BEGIN
SELECT  dbo.Tilmelding.TurID AS id, dbo.Tur.Titel AS Turnavn, SUM(dbo.Tilmelding.AntalTotal) AS Total, MAX(DISTINCT dbo.Tur.AntalMax) AS MaxPrTur
FROM  dbo.Tilmelding INNER JOIN dbo.Tur ON dbo.Tilmelding.TurID = dbo.Tur.TurID GROUP BY dbo.Tilmelding.TurID, dbo.Tur.Titel
END

Den skal være
ALTER PROCEDURE [dbo].[zMem_AntalPladser]
AS BEGIN
SELECT  dbo.Tilmelding.TurID AS id, dbo.Tur.Titel AS Turnavn, SUM(dbo.Tilmelding.AntalTotal) AS Total, MAX(DISTINCT dbo.Tur.AntalMax) AS MaxPrTur
FROM  dbo.Tilmelding INNER JOIN dbo.Tur ON dbo.Tilmelding.TurID = dbo.Tur.TurID GROUP BY dbo.Tilmelding.TurID, dbo.Tur.Titel
END
Avatar billede dr_chaos Nybegynder
13. marts 2007 - 16:20 #5
Du skal fjerne
command.Parameters.Add("@TurID", SqlDbType.Int);
command.Parameters["@TurID"].Value = Convert.ToInt32(lblTurID.Text);
Avatar billede dr_chaos Nybegynder
13. marts 2007 - 16:21 #6
brug:
lblID.Text = reader.GetInt32(reader.GetOrdinal("id")).ToString();
lblTur.Text = reader.GetString(reader.GetOrdinal("Turnavn")).ToString();
lblMax.Text = reader.GetInt32(reader.GetOrdinal("MaxPrTur")).ToString();
lblTotal.Text = reader.GetInt32(reader.GetOrdinal("Total")).ToString();
Avatar billede dr_chaos Nybegynder
13. marts 2007 - 16:22 #7
Du bruger ikke parametrene i din stored procedure.
Hvis du skal bruge dem skal du bruge
command.Parameters.AddWithValue("@TurID", lblTurID.Text);
Avatar billede kalp Novice
13. marts 2007 - 16:28 #8
ja delvist vrøvl... han behøver ikke lave paramaters add på dem alle korrekt, men så ville jeg skrive den..

using (SqlCommand command = new SqlCommand("EXECUTE zMem_AntalPladser @TurID", conTur))

og

command.Parameters.AddWithValue("@TurID", lblTurID.Text);

sådan plejer jeg at gøre, men så skal man sikkert også fjerne
command.CommandType = CommandType.StoredProcedure;

hvilket måske er derfor du siger vrøvl til mit forslag;o)
men det virker.
Avatar billede dr_chaos Nybegynder
13. marts 2007 - 16:34 #9
Jeg ved godt at det virker med det er i min verden en smule for asp agtigt :)
Derfor vrøvl.
Avatar billede kalp Novice
13. marts 2007 - 16:38 #10
ja, men jeg kommer også fra ASP:P
Avatar billede dr_chaos Nybegynder
13. marts 2007 - 17:06 #11
jojo det gør jeg såmænd også :)
Avatar billede mema Nybegynder
14. marts 2007 - 11:57 #12
Hej alle.
På min første Webform har jeg en Gridview, som viser Tur-titel, id og en Select-button som viser detaljerne for den valgt tur i en tilkoblet DetailView nederst. Så har jeg en Hyperlink under denne DetailView, hvilke skal bruges at komme til tilmeldingsformularen, som vi snakker om.
Senere skal jeg trække MaxPrTur fra Total (tatale tilmeldinger indtil nu), og så lader brugeren at tilmelde sig, hvis MaxPrTur ikke er nået. Men dette er måske et andet spørgsmå.
I først omgang ville jeg bare gerne vise informationerne fra DetailView overst på tilmeldingsskemaet på nogle labels.

Jeg ville spørge dr_chaos om min stored procedure skal ser nu sådan ud?
---
ALTER PROCEDURE [dbo].[zMem_AntalPladser]

command.Parameters.AddWithValue("@TurID", lblTurID.Text);
command.Parameters.AddWithValue("@Titel", lblTur.Text);
command.Parameters.AddWithValue("@MaxPrTur", lblMax.Text);
command.Parameters.AddWithValue("@Total", lblTotal.Text);

AS BEGIN
SELECT  dbo.Tilmelding.TurID AS id, dbo.Tur.Titel AS Turnavn, SUM(dbo.Tilmelding.AntalTotal) AS Total, MAX(DISTINCT dbo.Tur.AntalMax) AS MaxPrTur
FROM  dbo.Tilmelding INNER JOIN dbo.Tur ON dbo.Tilmelding.TurID = dbo.Tur.TurID GROUP BY dbo.Tilmelding.TurID, dbo.Tur.Titel
END
----
Og hvis ja, så skulle jeg tilføje parameters på denne måde i min metode?
using (SqlCommand command = new SqlCommand("EXECUTE zMem_AntalPladser @TurID", conTur))
Og så den valgte post viser de rigtige værdier for alle disse 4 felter, eller skal jeg også resterende felter (Titel, MaxPrTur og Total)?
Avatar billede dr_chaos Nybegynder
14. marts 2007 - 12:28 #13
din sp skal se ud på denne måde:
ALTER PROCEDURE [dbo].[zMem_AntalPladser]
AS BEGIN
SELECT  dbo.Tilmelding.TurID AS id, dbo.Tur.Titel AS Turnavn, SUM(dbo.Tilmelding.AntalTotal) AS Total, MAX(DISTINCT dbo.Tur.AntalMax) AS MaxPrTur
FROM  dbo.Tilmelding INNER JOIN dbo.Tur ON dbo.Tilmelding.TurID = dbo.Tur.TurID GROUP BY dbo.Tilmelding.TurID, dbo.Tur.Titel
END
Avatar billede dr_chaos Nybegynder
14. marts 2007 - 12:29 #14
din metode skal være:
private void VisValues()
{
using (SqlConnection conTur = new SqlConnection(@"Server=GJJH\MC;Integrated Security=SSPI;database=Tilmeld"))
using (SqlCommand command = new SqlCommand("zMem_AntalPladser", conTur))       
{
command.CommandType = CommandType.StoredProcedure;
command.Connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
if (reader.Read())
{
lblID.Text = reader.GetInt32(reader.GetOrdinal("TurID")).ToString();
lblTur.Text = reader.GetString(reader.GetOrdinal("Titel")).ToString();
lblMax.Text = reader.GetInt32(reader.GetOrdinal("AntalMax")).ToString();
lblTotal.Text = reader.GetInt32(reader.GetOrdinal("AntalTotal")).ToString();
conTur.Close();
}
}
}
}
Avatar billede dr_chaos Nybegynder
14. marts 2007 - 12:30 #15
På den måde får du alle turer ud.
hvis det skal være en bestemt tur skal du bruge:
ALTER PROCEDURE [dbo].[zMem_AntalPladser]
@TurID int
AS BEGIN
SELECT  dbo.Tilmelding.TurID AS id, dbo.Tur.Titel AS Turnavn, SUM(dbo.Tilmelding.AntalTotal) AS Total, MAX(DISTINCT dbo.Tur.AntalMax) AS MaxPrTur
FROM  dbo.Tilmelding INNER JOIN dbo.Tur ON dbo.Tilmelding.TurID = dbo.Tur.TurID
WHERE Tur.TurID = @TurID
GROUP BY dbo.Tilmelding.TurID, dbo.Tur.Titel
END
Avatar billede dr_chaos Nybegynder
14. marts 2007 - 12:31 #16
private void VisValues()
{
using (SqlConnection conTur = new SqlConnection(@"Server=GJJH\MC;Integrated Security=SSPI;database=Tilmeld"))
using (SqlCommand command = new SqlCommand("zMem_AntalPladser", conTur))       
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@TurID", lblTurID.Text);
command.Connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
if (reader.Read())
{
lblID.Text = reader.GetInt32(reader.GetOrdinal("TurID")).ToString();
lblTur.Text = reader.GetString(reader.GetOrdinal("Titel")).ToString();
lblMax.Text = reader.GetInt32(reader.GetOrdinal("AntalMax")).ToString();
lblTotal.Text = reader.GetInt32(reader.GetOrdinal("AntalTotal")).ToString();
conTur.Close();
}
}
}
}
Avatar billede mema Nybegynder
14. marts 2007 - 12:49 #17
For Kommentar: dr_chaos 14/03-2007 12:29:40 får jeg følgende fejl i browser:
----
TurID
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.IndexOutOfRangeException: TurID
Avatar billede mema Nybegynder
14. marts 2007 - 13:06 #18
For Kommentar: "dr_chaos 14/03-2007 12:30:54" og "Kommentar: dr_chaos 14/03-2007  12:31:44" får jeg også denne fejl:
-----
TurID
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.IndexOutOfRangeException: TurID
Source Error:
Line 112: lblID.Text = reader.GetInt32(reader.GetOrdinal("TurID")).ToString();
Avatar billede dr_chaos Nybegynder
14. marts 2007 - 13:20 #19
Sorry. havde faktisk skrevet det rigtige tidligere:
lblID.Text = reader.GetInt32(reader.GetOrdinal("id")).ToString();
lblTur.Text = reader.GetString(reader.GetOrdinal("Turnavn")).ToString();
lblMax.Text = reader.GetInt32(reader.GetOrdinal("MaxPrTur")).ToString();
lblTotal.Text = reader.GetInt32(reader.GetOrdinal("Total")).ToString();
Avatar billede mema Nybegynder
14. marts 2007 - 13:29 #20
Ja tak. det var det:-)
Send venligst et svar.

Den anden ting var at jeg skal trække "Total" fra "MaxPrTur" og vise den også på en label.
Måske skal jeg oprette en ny sp eller lave om på koden.
Hvis jeg skal oprette et nyt spørgsmål, sige venligst bare til.
Avatar billede dr_chaos Nybegynder
14. marts 2007 - 13:45 #21
Svar:)
den er gratis :
ALTER PROCEDURE [dbo].[zMem_AntalPladser]
@TurID int
AS BEGIN
SELECT  dbo.Tilmelding.TurID AS id, dbo.Tur.Titel AS Turnavn, SUM(dbo.Tilmelding.AntalTotal) AS Total, MAX(DISTINCT dbo.Tur.AntalMax) AS MaxPrTur,
MAX(DISTINCT dbo.Tur.AntalMax) - SUM(dbo.Tilmelding.AntalTotal) as LedigePladser
FROM  dbo.Tilmelding INNER JOIN dbo.Tur ON dbo.Tilmelding.TurID = dbo.Tur.TurID
WHERE Tur.TurID = @TurID
GROUP BY dbo.Tilmelding.TurID, dbo.Tur.Titel
END
Avatar billede mema Nybegynder
14. marts 2007 - 13:50 #22
Tusind tak.
Avatar billede dr_chaos Nybegynder
14. marts 2007 - 13:53 #23
np :)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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