webForumDet fria alternativet

Output returnerar 8 hela tiden (T-SQL)

13 svar · 746 visningar · startad av SebastianE

SebastianEMedlem sedan nov. 2004100 inlägg
#1

Har en lagrad procedur som ser ut så här

ALTER PROC hamtaBilderVy
(
	@rader INT output,
	@StartRad INT,
	@SlutRad INT,
	@userID uniqueidentifier
)

AS
BEGIN
SELECT tillhorandeAnvandarID, bildid, bildAdress, altTagg, titleTagg, datum, (SELECT COUNT (bildid) FROM bildbehorighet WHERE bildid=bilder.bildid) AS Behorighet
FROM (
	SELECT tillhorandeAnvandarID ,bildid, bildAdress, altTagg, titleTagg, datum, (
	SELECT COUNT (bildid) FROM bildbehorighet WHERE bildid=bilder.bildid) AS Behorighet, ROW_NUMBER() OVER(Order BY bildID) AS RowNumber
	FROM bilder
)
bilder
WHERE RowNumber >= @StartRad AND RowNumber <= @SlutRad AND bilder.tillhorandeAnvandarID=@userID
END

SELECT @rader=COUNT(bildid) FROM bilder
WHERE tillhorandeAnvandarID=@userID

Kör man

SELECT COUNT (bildID) FROM BILDER
WHERE tillhorandeAnvandarID='någotuserid'

Får man ut värdet 14 för en speciell användare.

Kör man den lagrade proceduren får man ut att @rader har värdet 8. Har testat med SET @rader=100. Lik förbaskat får man ut att @rader har värdet 8.

För att köra min lagrade procedur använder jag mig utav ASP.NET C#
där jag har följande kod i ett Dataåtkomstlager

                SqlCommand cmd = new SqlCommand("hamtaBilderVy", con);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@rader", SqlDbType.Int);
                cmd.Parameters["@rader"].Direction = ParameterDirection.Output;

                cmd.Parameters.AddWithValue("@StartRad", startRad);
                cmd.Parameters.AddWithValue("@SlutRad", slutRad);
                cmd.Parameters.AddWithValue("@userID", userID);

                int rader = (int)(cmd.Parameters["@rader"].Value);

rader får då värdet 8 :(

Någon som har idé vad jag gör för fel och hur man åtgärdar det?

nitro2k01Medlem sedan aug. 20039 342 inlägg
#2

Jag är ingen stjärna på SQL, men ett par saker jag tänker på. Ingenstans verkar du faktiskt köra frågan. Det kanske inte är så man gör dock?
En annan sak jag funderar över. Har du prövat att skriva ut cmd.Parameters["@rader"].Value till debugkonsolen eller dylikt utan att casta den till en int?

SebastianEMedlem sedan nov. 2004100 inlägg
#3

nitro2k01 skrev:

Jag är ingen stjärna på SQL, men ett par saker jag tänker på. Ingenstans verkar du faktiskt köra frågan. Det kanske inte är så man gör dock?
En annan sak jag funderar över. Har du prövat att skriva ut cmd.Parameters["@rader"].Value till debugkonsolen eller dylikt utan att casta den till en int?

Klart jag kör frågan men den koden har jag inte tagit med. Att typkonventera om den till en string går tyvärr inte då den är av typen int. Tyvärr tror jag inte (har inte lyckats) att få ett värde av cmd.Parameters["@rader"].Value i debugmodet. Dock får jag ut värdet 8 på int rader.

GeinMedlem sedan sep. 20005 700 inlägg
#4

Det skulle helt klart underlätta om man fick se hur du exekverar proceduren.

SebastianEMedlem sedan nov. 2004100 inlägg
#5

Gein skrev:

Det skulle helt klart underlätta om man fick se hur du exekverar proceduren.

Koden för att exekvera frågan

    public static ArrayList hamtaVyBilder(int startRad, int slutRad, string userID)
    {
        using (SqlConnection con = new SqlConnection(anslutningStrang))
        {
            try
            {
                //Öppna databasanslutning
                con.Open();

                //Skapa ett kommando och lägger till parametrars
                SqlCommand cmd = new SqlCommand("hamtaBilderVy", con);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@rader", SqlDbType.VarChar);
                cmd.Parameters["@rader"].Direction = ParameterDirection.Output;
                cmd.Parameters.AddWithValue("@StartRad", startRad);
                cmd.Parameters.AddWithValue("@SlutRad", slutRad);
                cmd.Parameters.AddWithValue("@userID", userID);

                int rader = (int)(cmd.Parameters["@rader"].Value);

                // Exekvera kommandot.
                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    ArrayList list = new ArrayList();
                    // Advance to the next record.
                    if (reader.HasRows)
                    {
                        while (reader.Read())
                        {
                            // Skapar och retunerar ett objekt
                            list.Add(new Bilder(reader.GetGuid(0).ToString(), reader.GetInt32(1), reader.GetString(2), reader.GetString(3), reader.GetString(4), reader.GetDateTime(5), reader.GetInt32(6), rader));
                        }
                        return list;
                    }
                    else
                    {
                        throw new ApplicationException("Inga bilder hittades för användaren.");
                    }
                }
            }
            catch (Exception ex){
                throw new ApplicationException("Misslyckades hämta vybilder.<p>"+ex+"</p>");
            }
        }
    }
GeinMedlem sedan sep. 20005 700 inlägg
#6

Okej, jag är ju uppenbarligen inte helt hemma med ASP.NET C#, speciellt inte DB-anrop.
Hur blir det om du exekverar proceduren direkt i Management Studio?

DECLARE @rader int
EXECUTE hamtaBilderVy @rader output, [b]..., ..., ...[/b]
SebastianEMedlem sedan nov. 2004100 inlägg
#7

Gein skrev:

Okej, jag är ju uppenbarligen inte helt hemma med ASP.NET C#, speciellt inte DB-anrop.
Hur blir det om du exekverar proceduren direkt i Management Studio?

DECLARE @rader int
EXECUTE hamtaBilderVy @rader output, [b]..., ..., ...[/b]

Med frågan
DECLARE @rader int
EXECUTE hamtaBilderVy @rader output, @StartRad=10, @SlutRad =15, @userID='e70436aa-073d-483c-ac4c-b7c3ab1ab386'

Får jag ut mina rader. När jag kollar under fliken Message i Microsoft SQL Server Management Studio får jag bara fram (5 row(s) affected) :OO

GeinMedlem sedan sep. 20005 700 inlägg
#8

Vad innehåller @rader efter att du kört det kommandot?
Alltså:

DECLARE @rader int
EXECUTE hamtaBilderVy @rader output, @StartRad=10, @SlutRad =15, @userID='e70436aa-073d-483c-ac4c-b7c3ab1ab386'
SELECT @rader

Får du ett förväntat resultat eller inte i detta fall?

SebastianEMedlem sedan nov. 2004100 inlägg
#9

Gein skrev:

Vad innehåller @rader efter att du kört det kommandot?
Alltså:

DECLARE @rader int
EXECUTE hamtaBilderVy @rader output, @StartRad=10, @SlutRad =15, @userID='e70436aa-073d-483c-ac4c-b7c3ab1ab386'
SELECT @rader

Får du ett förväntat resultat eller inte i detta fall?

Japp det får jag!

GeinMedlem sedan sep. 20005 700 inlägg
#10

Då borde vi kunna konstatera att det är något vid anropet i C# som är fel. Tyvärr kan jag inte hjälpa dig där.

SebastianEMedlem sedan nov. 2004100 inlägg
#11

Gein skrev:

Då borde vi kunna konstatera att det är något vid anropet i C# som är fel. Tyvärr kan jag inte hjälpa dig där.

Japp. Men tusen tack för hjälpen ändå!

SebastianEMedlem sedan nov. 2004100 inlägg
#12

Det var visst fel i min ASP.NET kod. Så nu funkar allt :)

GeinMedlem sedan sep. 20005 700 inlägg
#13

Skriv gärna ut vad felet var så kanske det hjälper andra? ;)

SebastianEMedlem sedan nov. 2004100 inlägg
#14

Gein skrev:

Skriv gärna ut vad felet var så kanske det hjälper andra? ;)

Självfallet.

SQL-frågan var helt rätt. Vad som var problemet kan man läsa på http://www.dominicpettifer.co.uk/displayBlog.aspx?id=8.

Fick göra om min asp.net kod till följande:

 public static ArrayList hamtaVyBilder(int startRad, int slutRad, string userID)
  {
  using (SqlConnection con = new SqlConnection(anslutningStrang))
  {
  try
  {
  //Öppna databasanslutning
  con.Open();

  //Skapa ett kommando och lägger till parametrars
  SqlCommand cmd = new SqlCommand("hamtaBilderVy", con);
  cmd.CommandType = CommandType.StoredProcedure;
  cmd.Parameters.AddWithValue("@rader", SqlDbType.Int);
  cmd.Parameters["@rader"].Direction = ParameterDirection.Output;
  cmd.Parameters.AddWithValue("@StartRad", startRad);
  cmd.Parameters.AddWithValue("@SlutRad", slutRad);
  cmd.Parameters.AddWithValue("@userID", userID);

  // Exekvera kommandot.
  using (SqlDataReader reader = cmd.ExecuteReader())
  {
  ArrayList list = new ArrayList();
  
  // Advance to the next record.
  if (reader.HasRows)
  {
  while (reader.Read())
  {
  // Skapar och retunerar ett objekt
  list.Add(new Bilder(reader.GetGuid(0).ToString(), reader.GetInt32(1), reader.GetString(2), reader.GetString(3), reader.GetString(4), reader.GetDateTime(5), reader.GetInt32(6), rader));
  }
  int rader = Convert.ToInt32(cmd.Parameters["@rader"].Value);
  return list;
  }
  else
  {
  throw new ApplicationException("Inga bilder hittades för användaren.");
  }
  }

  }
  catch (Exception ex)
  {
  throw new ApplicationException("Misslyckades hämta vybilder.<br/><br/>"+ex);
  }
  }
  }
133 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)