14. januar 2001 - 22:03Der er
10 kommentarer og 1 løsning
Stored Procedure med parametre returnerer ikke recordset???
Jeg har lavet følgende Stored Procedure i MSSQL server 2000..
CREATE PROCEDURE stp_GetSubjects (@strKeyword varchar(255), @strOrderBy varchar(255), @intMediaID integer) AS DECLARE @SQLString NVARCHAR(500) set @SQLString = \"select ID, Title, Owner, MediaID, Link, DATEDIFF(hour, added, getdate()) as AgeInHours, Loaner,Added from Subject \"
If (@strKeyword <> null) Begin set @SQLString = @SQLString + \"Where (Title LIKE \'%\"+@strKeyword+\"%\' OR Owner = \'\" + @strKeyword + \"\')\" End
if (@intMediaID > -1) Begin set @SQLString = @SQLString + \" AND (MediaID = \"+ CONVERT(varchar(255), @intMediaID) + \")\" end
set @SQLString = @SQLString + \" Order By \" + @strOrderBy exec sp_executesql @SQLString GO
Når jeg kører den i Query Analyzer returnerer den det jeg vil ha\' - Men når jeg tilgår den fra VB eller ASP returnerer den ikke noget?? Således gi\'r et RecordCount i VB/ASP resultatet 0....? øv :-(
Hvis jeg i stedet for sjov genererer SQL strengen manuelt i stedet for runtime og smider den i SP\'en returnerer den faktisk det RecordSet jeg gerne vil ha\'.. Så jeg lurer på om det ikke er Exec\'en der laver puha?? Er jeg blevet tosset?
Ja - jeg ved godt det er mange point, men jeg bruger eksperten 2 gange om året - så mon ikke jeg holder til det (så kan det også være at jeg får et svar :-)
Jo - finten er bare at exec sp_executesql @SQLstring sådan set virker (for den sags skyld kan man udelade sp_executesql - men jeg har læst et eller andet sted at det gi\'r bedre performance) - Og så alligevel - kommandoen gi\'r ingen fejl - og returnerer det rigtige i Query Analyzer - men altså ikke i VB/ASP
hvis du ellers gør alt på samme måde, kan det at du godt nok får noget tilbage fra QA, men ikke fra et skript tyde på at det er noget med rettighederne. Er du sikker på at alle har ret til at udføre SP\'en, og at alle kan læse i registeret ?
Sådan ser kaldet ud i qa: stp_getsubjects \"star\", \"added desc\", 3
det bli\'r så til følgende kald:
select ID, Title, Owner, MediaID, Link, DATEDIFF(hour, added, getdate()) as AgeInHours, Loaner,Added from Subject Where (Title LIKE \'%star%\' OR Owner = \'star\') AND (MediaID = 3) Order By added desc
I VB gør jeg nogenlunde sådan (har fiflet lidt med forskellige cursortypes, men netop dette virker i hvert fald, hvis min stored procedure indeholder det reele kald)
Dim rstResult As ADODB.Recordset Dim cnn As ADODB.Connection Dim cmdGetSubjects As ADODB.Command \' \' Set cnn = CreateObject(\"ADODB.Connection\") Set rstResult = CreateObject(\"ADODB.Recordset\")
If Not IsNull(strKeyword) Then strKeyword = \"Null\" If Not IsNull(strOrderBy) Then strOrderBy = \"Added Desc\" If Not IsNumeric(intMediaID) Then intMediaID = -1
cnn.Open sDatabase Set cmdGetSubjects = CreateObject(\"ADODB.Command\") With cmdGetSubjects Set .ActiveConnection = cnn .CommandType = adCmdStoredProc .CommandText = \"stp_GetSubjects\" .CommandTimeout = 3600 .Parameters.Append cmdGetSubjects.CreateParameter(\"strKeyword\", adVarChar, adParamInput, 255, strKeyword) .Parameters.Append cmdGetSubjects.CreateParameter(\"strOrderBy\", adVarChar, adParamInput, 255, strOrderBy) .Parameters.Append cmdGetSubjects.CreateParameter(\"intMediaID\", adInteger, adParamInput, 4, intMediaID) End With
\' Dissociate Command from connection and close: Set cmdGetSubjects.ActiveConnection = Nothing
\' Dissociate Recordset from connection then close and dereference the connection: If rstResult.State = adStateOpen Then Set rstResult.ActiveConnection = Nothing
Mht. rettigheder, giver min Stored Procedure det korrekte resultat i VB hvis den i stedet for den RunTime genererede @SQLString indeholder det reelle kald - så rettighederne er i orden..
hmmmmm - Det kan også være at jeg er en KÆMPENAR... Som har skrevet: If Not IsNull(strKeyword) Then strKeyword = \"Null\" If Not IsNull(strOrderBy) Then strOrderBy = \"Added Desc\"
hvor der i virkeligheden skulle ha\' stået if IsNull...
Det er faktisk næsten sjovt... - hvis bare jeg ikke havde bokset med det i 4 timer og var ved at blive sindssyg ;-)
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.