webForumDet fria alternativet

problem att exekvera

21 svar · 738 visningar · startad av Vinnaren

VinnarenMedlem sedan sep. 2005833 inlägg
#1

Har två olika metoder varav en fungerar. Så nu är min fråga, varför fungerar inte den andra??

Fungerar

                conn.Open();

                SqlDataAdapter da = new SqlDataAdapter("dbo.Delete", conn);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.Parameters.Add("@username", SqlDbType.NVarChar, 255).Value = sc.UserName;
                da.SelectCommand.Parameters.Add("@comID", SqlDbType.Int, 5).Value = comID;
                da.SelectCommand.ExecuteNonQuery();

Fungerar Inte

                conn.Open();

                SqlCommand cmd = new SqlCommand("dbo.Delete", conn);
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Add(new SqlParameter("@username", SqlDbType.NVarChar, 255)).Value = sc.UserName;
                cmd.Parameters.Add(new SqlParameter("@comID", SqlDbType.Int, 5)).Value = comID;
                cmd.ExecuteNonQuery();

Vad kan det vara för fel på den undre?

Tacksam för all hjälp :stud

CatZMedlem sedan jan. 20022 440 inlägg
#2

/RED

Ursäkta mig... Den nedersta är till en parameteriserad fråga... den övre är till en stored procedure.

VinnarenMedlem sedan sep. 2005833 inlägg
#3

nep, har även provat den, o den kraschar på cmd.ExecuteNonQuery();

Nott annat som kan vara fel :q

CatZMedlem sedan jan. 20022 440 inlägg
#4

Jag tänkte fel, rätt svar står i förra inlägget.

VinnarenMedlem sedan sep. 2005833 inlägg
#5

ok, men kan man inte anv stored procedure i en SqlCommand??

CatZMedlem sedan jan. 20022 440 inlägg
#6

Usch vad jag är trött, du kan göra som du gjorde fast du måste skapa parametern innan du lägger till den.

SqlParameter username = new SqlParameter("@username", SqlDbType.NVarChar, 255);
paramUsername.Value = sc.UserName;
SqlParameter comid = new SqlParameter("@comID", SqlDbType.Int, 5);
paramComid.Value = comID;
cmd.Parameters.Add(paramUsername);
cmd.Parameters.Add(paramComid);
CatZMedlem sedan jan. 20022 440 inlägg
#7

Jag använder en funktion för att skapa parametern som är lite smidigare om du vill göra på det nedre sättet.

protected static SqlParameter pMaker(String parameterName, SqlDbType DbType, Int32 Size, ParameterDirection Direction, Object Value)
{
	SqlParameter param;

	if(Size > 0)
	{
		param = new SqlParameter(parameterName, DbType, Size);
	}
	else
	{
		param = new SqlParameter(parameterName, DbType);
	}
	param.Direction = Direction;
	if (!(Direction == ParameterDirection.Output && Value == null))
	{
		param.Value = Value;
	}
	return param;
}

Sedan gör som på det nedre sättet och anropar på följande vis

 cmd.Parameters.Add(pMaker("@username", SqlDbType.NVarChar, 255, ParameterDirection.Input, sc.UserName))
VinnarenMedlem sedan sep. 2005833 inlägg
#8

ok, tack. Men får inte:

                conn.Open();

                SqlCommand cmd = new SqlCommand("dbo.Delete", conn);
                cmd.CommandType = CommandType.StoredProcedure;

                SqlParameter paramUsername = new SqlParameter("@username", SqlDbType.NVarChar, 255);
                paramUsername.Value = sc.UserName;

                SqlParameter paramComid = new SqlParameter("@comID", SqlDbType.Int, 5);
                paramComid.Value = comID;

                cmd.Parameters.Add(paramUsername);
                cmd.Parameters.Add(paramComid); 
                
                cmd.ExecuteNonQuery();

att fungera.

får felmedelandet:
Procedure or function Delete has too many arguments specified.

men SP har:
(
@username varchar(255),
@comID int
)

Det vill sig inte :r

CatZMedlem sedan jan. 20022 440 inlägg
#9

Hur ser din procedure ut då?

VinnarenMedlem sedan sep. 2005833 inlägg
#10
ALTER PROCEDURE [dbo].[Delete] 
	(
	@username varchar(255),
	@comID int
	)
AS
DECLARE @ErrMsg varchar(50)
SET NOCOUNT ON

BEGIN TRAN
	BEGIN TRY
	

	Set @ErrMsg = 'Fel när kommentaren skulle tas bort'
	DELETE FROM comment WHERE comID = @comID

COMMIT TRAN
	END TRY
	BEGIN CATCH
		ROLLBACK TRAN
		RAISERROR(@ErrMsg,16,1)
	END CATCH

borde ju inte vara fel på den då det "andra" alternativet fungerar :OO

GladhMedlem sedan maj 20012 812 inlägg
#11

Testa följande istället

                SqlParameter paramUsername = new SqlParameter("@username", SqlDbType.VarChar, 255);
                paramUsername.Value = sc.UserName;

                SqlParameter paramComid = new SqlParameter("@comID", SqlDbType.Int);
                paramComid.Value = comID;

Det är skillnad på NVarchar och Varchar, samt att du inte bör skicka med en storlek på din int...

- M

VinnarenMedlem sedan sep. 2005833 inlägg
#12

tack, men det fungerade tyvärr inte häller :(

Får väll anv SqlDataAdapter då ingen annan vill fungera :l

ZaimanMedlem sedan dec. 20014 239 inlägg
#13

Lite småfrågor OT
Är det inte dumt att använda ordet Delete som namn på en procedur? Även om du kapslar in det kan du inte använda något annat? Är inte Delete ett reserverat ord?

CatZMedlem sedan jan. 20022 440 inlägg
#14

håller med Zaiman, ett bättre ord vore spDeleteDETDUTARBORT ;)

VinnarenMedlem sedan sep. 2005833 inlägg
#15

ok, har bytt namn på proceduren, men det hjälpte inte :r

Känns omöjligt med SqlCommand :l

GladhMedlem sedan maj 20012 812 inlägg
#16

Märkligt följande får jag att fungera.

                SqlConnection connection = new SqlConnection(Connectionstring);
                //-- Create command to call SP
                IDbCommand command = new SqlCommand();
                command.CommandType = CommandType.StoredProcedure;
                command.CommandText = "dbo.GetCategories";
                command.Connection = connection;

                SqlParameter parameter = new SqlParameter("@LCID", SqlDbType.Int);
                parameter.Value = lcid;
                command.Parameters.Add(parameter);

                command.Connection.Open();
                int i = command.ExecuteNonQuery();

Får jag att fungera, nu kör jag mot SQL2005 men det skall väl knappast spela någon roll.

- M

VinnarenMedlem sedan sep. 2005833 inlägg
#17

tack, men det vill sig inte, skiter i den nu, den andra fungerar ju :bire

har en annan fråga om frågor §e

                conn.Open();
                SqlCommand cmd = new SqlCommand("dbo.getBloggPropertiesByBloggId", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@id", bp.BloggID);

                using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
                {
                    if (reader.Read())
                    {
                        return new BloggProperties(reader.GetString(0), reader.GetString(1), reader.GetString(2), reader.GetInt32(3), reader.GetString(4), reader.GetString(5), reader.GetString(6), reader.GetInt32(7));
                    }
                    else
                    {
                        throw new ApplicationException("Bloggen finns inte");
                    }
                }

Den kraschar när den ska returnera då 6 & 7 är null, dessa ska kunna vara null, men hur gör man om man returnerar det? som det är nu funkar det inte.

Tacksam för all hjälp :stud

CatZMedlem sedan jan. 20022 440 inlägg
#18

det beror på vad det är för värden...

du kan inte göra reader.GetInt32 på ett null värder då måste kontrollera om det är null och sedan konvertera till 0.

if (reader["KolumnNamn6"] == DbNull.Value)
{
	value = 0
}
else
{
	value = reader.GetInt32(6)
}
VinnarenMedlem sedan sep. 2005833 inlägg
#19

ok,tack, gjorde om sql frågan så den returnerar 0 isf null på int, men det hjälpte inte, får felmeddelandet:
System.Data.SqlTypes.SqlNullValueException: Data is Null. This method or property cannot be called on Null values.

Är det funktionen som tar emot resultatet som e fel?
dvs.

    public BloggProperties(String bloggtype, String bloggname, String bloggowner, int bloggid, String themename, String thememap, String toppicture, int height)
    {
        BloggType   = bloggtype;
        BloggID = bloggid;
        BloggName = bloggname;
        BloggOwner = bloggowner;
        ThemeName = themename;
        ThemeMap = thememap;
        Height = height;
    }
doggelitoMedlem sedan juni 20003 076 inlägg
#20

Vinnaren skrev:

men hur gör man om man returnerar det?

Om databasen får returnera null så borde metoden BloggProperties tillåta det.

public BloggProperties(int? propertynamn, ...)
...
140 ms totalt · 3 externa anrop · v20260731065814-full.86db40fa
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)