26. oktober 2008 - 10:03Der er
9 kommentarer og 2 løsninger
Stored procedure returnere ingen data
Jeg har en SP som skal hente max værdien og returnere denne.
USE [Marked] GO
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO
ALTER PROCEDURE [dbo].[GetAnnonceId]
AS BEGIN Declare @MaxId Int
SET NOCOUNT ON;
SELECT @MaxId = MAX(Id) FROM Advertisement return @MaxId END
jeg henter data fra SP med følgende kode
strConnection = System.Configuration.ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString sqlConn = New SqlConnection(strConnection)
sqlCmd = New SqlCommand("EXEC GetAnnonceId", sqlConn) Try sqlConn.Open() SQLdr = sqlCmd.ExecuteReader() If SQLdr.HasRows = True Then SQLdr.Read() Label1.Text = SQLdr.Item("Id") End If
Men if sætningen bliver ikke kørt. Jeg har prøvet uden if. Så kører den alt igennem men der er ingen data i SQLdr?
Nu er jeg ikke lige ekspert på området med .NET vs SQL, men din stp laver en return-value som hedder @MaxId, og der hvor du prøver at mose resultatet ind i en Label, skriver du "SQLdr.Item("Id"). Jeg kan ikke se hvorfra .NET kan se hvad det er du forsøger at hente ud.
Da du laver en "..HasRows..", så vil jeg ikke tro at din sp skal lave en return-value, men derimod returnere én række med én kolonne. Prøv denne i stedet:
ALTER PROCEDURE [dbo].[GetAnnonceId] AS SELECT MAX(Id) AS Id FROM Advertisement
Som jeg skrev kl 10:10, så havde jeg set fejlen med id og havde rettet den, men det hjalp ikke. Jeg har også prøvet med dit eksempel, hvilket heller ikke virker. Nu kører den godt nok if sætningen, men resultatet bliver en tom label1
Kan det tænkes at det er fordi resultatet returneres i en variant-type? Jeg har oplevet (og derfor hader jeg dem), at hvis værdien f.eks. er taltegn ("12321" og dermed en streng), bliver det alligevel håndteret som et heltal. Derved er strengdelen i varianten er tom.
Er ikke .NET'ter men da det meget ligner det jeg arbejder med (et af Anders Hejlsbergs tidligere projekter) - kan du måske angive det eksplicit a la dette pseudokode Label1.Text = integer(SQLdr.Item("Id")).AsString;
Har du mulighed for at prøve at køre sp'en manuelt i en SQL Server Management Studio? Fejlen kan jo ligge 2 steder - enten i sp'en, eller i .NET koden. Og hvis sp'en fungerer, så er der nok mere hjælp at hente i .NET gruppen
Og det her er nok et rigtig dumt spørgsmål, men der ER data i tabellen ik'?
Du kalder ExecuteReader som returnerer en DataReader - den bruges til at læse result set med, men din SP returnerer ikke et result set men en retur værdi - du skal bruge noget andet kode for at læse en retur værdi.
Dim cmd As SqlCommand = New SqlCommand("GetAnnonceId", con) cmd.CommandType = CommandType.StoredProcedure Dim ret As SqlParameter = New SqlParameter("@maxis", SqlDbType.Int) ret.Direction = ParameterDirection.ReturnValue cmd.Parameters.Add(ret) cmd.ExecuteNonQuery Dim maxid As Integer = CType(cmd.Parameters("@retval").Value, Integer)
Jeg har fået det til at virke. Jeg prøvede at skrive tilbage herinde i eftermiddags, men min post er tilsyneladende forsvundet?
I SP skrev jeg SELECT MAX(Id) As MaxId FROM Advertisement og på siden skrev jeg MaxId = SQLdr.Item("MaxId")
Det var sjang og hrc det fik løst problemet, så hvis i vil lægge et svar så får i point. Beklager Arne v at jeg ikke har fået lukket tråden før du svarede.
Ja, hrc, det var .AsString der fik mig på sporet. Tak for jeres hjælp
Synes godt om
Ny brugerNybegynder
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.