13. marts 2007 - 16:09Der 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?
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
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]
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)?
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
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
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
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.
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.
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
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.