webForumDet fria alternativet

problem att exekvera

.NET

21 svar · 738 visningar · startad av Vinnaren

Medlem sedan sep. 2005833 inlägg
Frågan#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

Medlem 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.

Medlem sedan sep. 2005833 inlägg
#3

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

Nott annat som kan vara fel :q

Medlem sedan jan. 20022 440 inlägg
#4

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

Medlem sedan sep. 2005833 inlägg
#5

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

Medlem 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);
Medlem 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))
Medlem 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

Medlem sedan jan. 20022 440 inlägg
#9

Hur ser din procedure ut då?

Medlem 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

Medlem 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

Medlem 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

Medlem 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?

Medlem sedan jan. 20022 440 inlägg
#14

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

Medlem 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

Medlem 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

Medlem 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

Medlem 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)
}
Medlem 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;
    }
Medlem 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, ...)
...
267 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)