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?
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?
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 Det skulle helt klart underlätta om man fick se hur du exekverar proceduren.
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 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]
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 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?
GeinMedlem sedan sep. 20005 700 inlägg 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.
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å!
Det var visst fel i min ASP.NET kod. Så nu funkar allt :)
GeinMedlem sedan sep. 20005 700 inlägg Skriv gärna ut vad felet var så kanske det hjälper andra? ;)
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);
}
}
}