Oprettet søn. d. 17. oktober 2004 kl. 19:17:59

hnteknik
hnteknik (32.270 point. Point ude: 0)

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/ (...)

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

Skrevet søn. d. 17. oktober 2004 kl. 19:26:59| #1

arne_v
arne_v (1.005.623 point)
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# !

Skrevet søn. d. 17. oktober 2004 kl. 19:46:40| #2

hnteknik
hnteknik (32.270 point)
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

Skrevet søn. d. 17. oktober 2004 kl. 19:48:30| #3

arne_v
arne_v (1.005.623 point)
Nej.

prmAntalDeleted.Direction = adReturnValue;

skulle være nok.

Skrevet søn. d. 17. oktober 2004 kl. 20:33:26| #4

hnteknik
hnteknik (32.270 point)
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.

Skrevet søn. d. 17. oktober 2004 kl. 20:48:53| #5

arne_v
arne_v (1.005.623 point)
Jeg prøver at lave et eksempel !

Skrevet søn. d. 17. oktober 2004 kl. 20:52:03| #6

hnteknik
hnteknik (32.270 point)
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

Skrevet søn. d. 17. oktober 2004 kl. 20:56:41| #7

arne_v
arne_v (1.005.623 point)
Skal jeg lave et JS eksempel ?

Eller klarer du dig med VBS ?

Skrevet søn. d. 17. oktober 2004 kl. 21:05:24| #8

hnteknik
hnteknik (32.270 point)
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.
    }

Skrevet søn. d. 17. oktober 2004 kl. 22:08:09| #9

arne_v
arne_v (1.005.623 point)
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;
%>

Skrevet søn. d. 17. oktober 2004 kl. 22:08:45| #10

arne_v
arne_v (1.005.623 point)
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();
    }
}

Skrevet man. d. 18. oktober 2004 kl. 22:46:00| #11

hnteknik
hnteknik (32.270 point)
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

Skrevet man. d. 18. oktober 2004 kl. 22:47:51| #12


Skrevet man. d. 18. oktober 2004 kl. 22:56:10| #13

arne_v
arne_v (1.005.623 point)
Og det lyder meget mystisk. VBS og JS koden ser meget ens ud !

Skrevet man. d. 18. oktober 2004 kl. 22:59:31| #14

arne_v
arne_v (1.005.623 point)
Der er ikke en fejl under eksekvering af SP fra JS ?

Skrevet man. d. 18. oktober 2004 kl. 23:04:51| #15

hnteknik
hnteknik (32.270 point)
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.

Skrevet man. d. 18. oktober 2004 kl. 23:09:01| #16

hnteknik
hnteknik (32.270 point)
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.

Skrevet man. d. 18. oktober 2004 kl. 23:37:17| #17

arne_v
arne_v (1.005.623 point)
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.

Skrevet man. d. 18. oktober 2004 kl. 23:38:29| #18

arne_v
arne_v (1.005.623 point)
Samme med en UPDATE

Skrevet tir. d. 19. oktober 2004 kl. 00:37:11| #19

hnteknik
hnteknik (32.270 point)
Verden er forunderlig. Nu er det vist tid at ramme høknippet.

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Udskrive mappens navn

Oprettet den 8. februar 2012 kl. 13.32
no_doubt giver 60 point for svar | Giv et svar »

Flere tæller/counter SQL og ASP!

Oprettet den 7. februar 2012 kl. 20.09
denny giver 30 point for svar | Giv et svar »

hjælp til fejl

Oprettet den 1. februar 2012 kl. 10.54
sth giver 100 point for svar | Giv et svar »

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Her er fem sjove danske websider du skal kende

Trænger dine lattermuskler til en omgang fitness på dansk? Vi viser vej til fem websider fyldt med humor og vanvittig satire.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Nu kan du snart hente Windows 8

Den nye offentlige betaversion af Windows 8 er klar i denne måned.


Nyheder fra Computerworld

Teaser billede

Måske snart slut med Androids helt store problem

Android-platformen har længe været plaget af et særligt problem. Men måske er problemet nu ved at være elimineret.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger