Avatar billede hnteknik Novice
17. oktober 2004 - 19:17 Der er 18 kommentarer og
1 løsning

Hvordan fange returværdi fra Stored Procedure i ASP / javascript

Dette er en forlængelse af et spørgsmål rejst i http://www.eksperten.dk/spm/551132

Jeg har brug for at se, hvor mange records en slette SP fjerner.
Idanielsen kom med et godt bud på en sådan MS SQL SP:

@@ROWCOUNT hedder den.

CREATE PROCEDURE [DBO].[SLETGMLOGFEJLLOG] @Count int OUTPUT AS
DELETE FROM dbo.logind
WHERE    (datoogtid < { fn NOW() } - 14) OR
                      (Fejl = 1)
SET @Count = @@ROWCOUNT
GO

Denne SP, så gør sit job kaldes med følgelse ASP/JScript

<%
var con = Server.CreateObject("ADODB.Connection");
var cmd = Server.CreateObject("ADODB.Command");

try
{
    con.Open(db);
   
    cmd.ActiveConnection = con;
    cmd.CommandText = "SLETGMLOGFEJLLOG";
    cmd.CommandType = adCmdStoredProc;

    //prmAntalDeleted = Server.CreateObject("ADODB.Parameter");
    //prmAntalDeleted.Type = adInteger;
    //prmAntalDeleted.Size = 4;
    //prmAntalDeleted.Direction = adParamOutput;
   
    //cmd.Parameters.Append(prmAntalDeleted);
    cmd.Parameters.Append(cmd.CreateParameter("@Count", adInteger, adParamOutput,4));

    cmd.Execute;
    Response.Write("Der blev slettet : "  + cmd(0));
    //Response.Write("Der blev slettet : "  + cmd.Parameters("@Count").Value);
}
catch (e)
{
    Response.Write(e.message);
}
finally
{
    // clean up
    if (con.State == adStateOpen)
        con.Close;
    con = null;
}
%>


Det hele kører - blot returnes 'Der blev slettet : undefined'

Hvad laver jeg galt - skal jeg hellere fyre det af i VBScript ??

Henrik
Avatar billede arne_v Ekspert
17. oktober 2004 - 19:26 #1
Prøv noget a la:

prmAntalDeleted = Server.CreateObject("ADODB.Parameter");
prmAntalDeleted.Name = "@retval";
prmAntalDeleted.Type = adInteger;
prmAntalDeleted.Size = 4;
prmAntalDeleted.Direction = adReturnValue;
cmd.Parameters.Append(prmAntalDeleted);
cmd.Execute;
Response.Write("Der blev slettet : "  + cmd.Parameters("@retval).Value);

NB: Det er rent gætværk - jeg har har gættet på at ADO i JavaScript
    ligner ADO.NET i C# !
Avatar billede hnteknik Novice
17. oktober 2004 - 19:46 #2
Hej arne
@retval skal vel være kendt inde i SP ?

Jeg bruger denne:
<%// use this meta tag instead of adojavas.inc%>
<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->

og ved ikke om adReturnValue er kendt i adojavas.inc

Jeg prøver lige, men må lige have ISS ned og vende. Gik i baglås på en anden opgave.
Henrik
Avatar billede arne_v Ekspert
17. oktober 2004 - 19:48 #3
Nej.

prmAntalDeleted.Direction = adReturnValue;

skulle være nok.
Avatar billede hnteknik Novice
17. oktober 2004 - 20:33 #4
Det er fordelen ved at anvende try/catch

adReturnValue er ikke defineret.
den skal vist hedde adParamReturnValue, når der henvises til adojavas.inc
anvendes denne værdi returneres 'undefined for retval valuen.
Avatar billede arne_v Ekspert
17. oktober 2004 - 20:48 #5
Jeg prøver at lave et eksempel !
Avatar billede hnteknik Novice
17. oktober 2004 - 20:52 #6
Hm - nu har jeg konverteret det til VBA - og tænk jer det virker,
men hvad gik galt i Jscript udgaven ??!!

'Der blev slettet : 3 '
på denne kode
<%
set con = Server.CreateObject("ADODB.Connection")
set cmd = Server.CreateObject("ADODB.Command")
con.Open(db)
   
set cmd.ActiveConnection = con
cmd.CommandText = "SLETGMLOGFEJLLOG"
cmd.CommandType = adCmdStoredProc

set prmAntalDeleted = Server.CreateObject("ADODB.Parameter")
prmAntalDeleted.Name = "return"
prmAntalDeleted.Type = adInteger
prmAntalDeleted.Size = 4
prmAntalDeleted.Direction = adParamReturnValue

cmd.Parameters.Append(prmAntalDeleted)
//cmd.Parameters.Append(cmd.CreateParameter("return", adInteger, adParamReturnValue, 4))

cmd.Execute
Response.Write("Der blev slettet : "  & prmAntalDeleted.Value)
%>

og SP ser sådan ud

CREATE  PROCEDURE [DBO].[SLETGMLOGFEJLLOG]
AS
    Declare @Count INT
   
    DELETE FROM dbo.logind
    WHERE    (datoogtid < { fn NOW() } - 14) OR
                        (Fejl = 1)
    SET @Count =@@ROWCOUNT
    return( @Count)
GO
Avatar billede arne_v Ekspert
17. oktober 2004 - 20:56 #7
Skal jeg lave et JS eksempel ?

Eller klarer du dig med VBS ?
Avatar billede hnteknik Novice
17. oktober 2004 - 21:05 #8
Arne - jeg vil gerne fårstå hvad fanden der gik galt, så jeg vil hjertens gerne have et JS ex. ala ovenstående.

Henrik
Jeg er ved at gå over til Csharp ASP.NET, så jeg kan lige så godt bide i det sure æble og skik på det her. Csharp ser lidt anderledes ud:

private void btnGetAuthors_Click(object sender, System.EventArgs e)
    {
        //Create a connection to the SQL Server; modify the connection string for your environment.
        //SqlConnection MyConnection = new SqlConnection("server=(local);database=pubs;Trusted_Connection=yes");
        SqlConnection MyConnection = new SqlConnection("server=(local);database=pubs;UID=myUser;PWD=myPassword;");

        //Create a DataAdapter, and then provide the name of the stored procedure.
        SqlDataAdapter MyDataAdapter = new SqlDataAdapter("GetAuthorsByLastName", MyConnection);

        //Set the command type as StoredProcedure.
        MyDataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;

        //Create and add a parameter to Parameters collection for the stored procedure.
        MyDataAdapter.SelectCommand.Parameters.Add(new SqlParameter("@au_lname", SqlDbType.VarChar, 40));

        //Assign the search value to the parameter.
        MyDataAdapter.SelectCommand.Parameters["@au_lname"].Value = (txtLastName.Text).Trim();

        //Create and add an output parameter to the Parameters collection.
        MyDataAdapter.SelectCommand.Parameters.Add(new SqlParameter("@RowCount", SqlDbType.Int, 4));

        //Set the direction for the parameter. This parameter returns the Rows that are returned.
        MyDataAdapter.SelectCommand.Parameters["@RowCount"].Direction = ParameterDirection.Output;

        //Create a new DataSet to hold the records.
        DataSet DS = new DataSet();

        //Fill the DataSet with the rows that are returned.
        MyDataAdapter.Fill(DS, "AuthorsByLastName");

        //Get the number of rows returned, and assign it to the Label control.
        //lblRowCount.Text = DS.Tables(0).Rows.Count().ToString() & " Rows Found!"
        lblRowCount.Text = MyDataAdapter.SelectCommand.Parameters[1].Value + " Rows Found!";

        //Set the data source for the DataGrid as the DataSet that holds the rows.
        GrdAuthors.DataSource = DS.Tables["AuthorsByLastName"].DefaultView;

        //NOTE: If you do not call this method, the DataGrid is not displayed!
        GrdAuthors.DataBind();

        MyDataAdapter.Dispose(); //Dispose the DataAdapter.
        MyConnection.Close(); //Close the connection.
    }
Avatar billede arne_v Ekspert
17. oktober 2004 - 22:08 #9
CREATE PROCEDURE TEST_OUTRET
@outarg INTEGER OUTPUT
AS
SELECT @outarg = 123
RETURN 456
GO


<%@ Language="JScript" %>
<%
var adCmdStoredProc = 4;
var adParamOutput = 2;
var adParamReturnValue = 4;
var adInteger = 3;
var con = Server.CreateObject("ADODB.Connection");
con.open("Provider=SQLOLEDB; Server=ARNEPC2;Database=Test;User ID=sa;Password=;");
var cmd = Server.CreateObject("ADODB.Command");
cmd.ActiveConnection = con;
cmd.CommandType = adCmdStoredProc;
cmd.CommandText = "TEST_OUTRET";
cmd.Parameters.Append(cmd.CreateParameter("@retval", adInteger, adParamReturnValue));
cmd.Parameters.Append(cmd.CreateParameter("@outarg", adInteger, adParamOutput));
cmd.Execute;
Response.Write(cmd.Parameters("@outarg").Value + " " + cmd.Parameters("@retval").Value);
con.Close;
%>
Avatar billede arne_v Ekspert
17. oktober 2004 - 22:08 #10
C# kode som kalder samme SP:

using System;
using System.Data;
using System.Data.SqlClient;

class MainClass
{
    public static void Main(string[] args)
    {
        SqlConnection con = new SqlConnection("server=ARNEPC2;Integrated Security=SSPI;database=Test");
        con.Open();
        SqlCommand cmd = new SqlCommand("TEST_OUTRET", con);
        cmd.CommandType = CommandType.StoredProcedure;
        SqlParameter prm = new SqlParameter("@outarg", SqlDbType.Int, 0, "outarg");
        prm.Direction = ParameterDirection.Output;
        cmd.Parameters.Add(prm);
        SqlParameter ret = new SqlParameter("@retval", SqlDbType.Int);
        ret.Direction = ParameterDirection.ReturnValue;
        cmd.Parameters.Add(ret);
        cmd.ExecuteNonQuery();
        Console.WriteLine((int)cmd.Parameters["@outarg"].Value);
        Console.WriteLine((int)cmd.Parameters["@retval"].Value);
        con.Close();
    }
}
Avatar billede hnteknik Novice
18. oktober 2004 - 22:46 #11
Hi Arne - tak for din indsats. Dit script virker fint, men se lige her:

SP laves om til dette:

CREATE  PROCEDURE [DBO].[SLETGMLOGFEJLLOG]
@outarg INTEGER OUTPUT
AS
    DELETE FROM dbo.logind
    WHERE    (datoogtid < { fn NOW() } - 14) OR  (Fejl = 1)
    SELECT @outarg =@@ROWCOUNT
    RETURN 7913
GO

Dette VBA script kører upåklageligt:

<%
set con = Server.CreateObject("ADODB.Connection")
set cmd = Server.CreateObject("ADODB.Command")
con.Open(db)
   
set cmd.ActiveConnection = con
cmd.CommandText = "SLETGMLOGFEJLLOG"
cmd.CommandType = adCmdStoredProc
cmd.Parameters.Append(cmd.CreateParameter("@retval", adInteger, adParamReturnValue, 4))
cmd.Parameters.Append(cmd.CreateParameter("@outarg", adInteger, adParamOutput, 4))
cmd.Execute
Response.Write(cmd.Parameters("@outarg").Value & " " & cmd.Parameters("@retval").Value)
%>

Dit JS script lagt over på min SP:
<%
var adCmdStoredProc = 4;
var adParamOutput = 2;
var adParamReturnValue = 4;
var adInteger = 3;
var con = Server.CreateObject("ADODB.Connection");
con.open(db);
var cmd = Server.CreateObject("ADODB.Command");
cmd.ActiveConnection = con;
cmd.CommandType = adCmdStoredProc;
cmd.CommandText = "SLETGMLOGFEJLLOG";
cmd.Parameters.Append(cmd.CreateParameter("@retval", adInteger, adParamReturnValue));
cmd.Parameters.Append(cmd.CreateParameter("@outarg", adInteger, adParamOutput));
cmd.Execute;
Response.Write(cmd.Parameters("@outarg").Value + " " + cmd.Parameters("@retval").Value);
con.Close;
%>

giver blot 'undefined  undefined'

Arne - jeg må være ramt af ond ånd. Smid et svar. Jeg må leve med min skæbne.
Henrik
Avatar billede arne_v Ekspert
18. oktober 2004 - 22:47 #12
svar
Avatar billede arne_v Ekspert
18. oktober 2004 - 22:56 #13
Og det lyder meget mystisk. VBS og JS koden ser meget ens ud !
Avatar billede arne_v Ekspert
18. oktober 2004 - 22:59 #14
Der er ikke en fejl under eksekvering af SP fra JS ?
Avatar billede hnteknik Novice
18. oktober 2004 - 23:04 #15
Strikes me. Jeg havde i det mindste forventet, at den havde returnet 'undefined 7913'.

Som sagt har jeg blot kopieret din kode, som virker og rettet SP navn. SP virker som forventet ved jeg fra VBA koden. Nå - jeg må leve med VBA koden selvom det irriteterer mig. Jeg bliver klogerer hver dag på det der SP, som er knusende smart.
Avatar billede hnteknik Novice
18. oktober 2004 - 23:09 #16
SP returnere f.eks. 3 7913 i VBA koden efter at have slettet 3 indgange.
Ikke fordi der skal rodes mere i det, men hvis du lavede en test tabel med et par datoer og fejl (true/false) og testede om min SP på din tabel kunne køre i dit script so to speek.
Avatar billede arne_v Ekspert
18. oktober 2004 - 23:37 #17
Hm.

Hvis det kan trøste dig, så får jeg samme fejl lige så snart der optræder en
DELETE statement i SP'en.
Avatar billede arne_v Ekspert
18. oktober 2004 - 23:38 #18
Samme med en UPDATE
Avatar billede hnteknik Novice
19. oktober 2004 - 00:37 #19
Verden er forunderlig. Nu er det vist tid at ramme høknippet.
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
Kurser inden for grundlæggende programmering

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