VinnarenMedlem sedan sep. 2005833 inlägg 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 /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 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 Jag tänkte fel, rätt svar står i förra inlägget.
VinnarenMedlem sedan sep. 2005833 inlägg ok, men kan man inte anv stored procedure i en SqlCommand??
CatZMedlem sedan jan. 20022 440 inlägg 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 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 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 Hur ser din procedure ut då?
VinnarenMedlem sedan sep. 2005833 inlägg 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 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 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 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 håller med Zaiman, ett bättre ord vore spDeleteDETDUTARBORT ;)
VinnarenMedlem sedan sep. 2005833 inlägg 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 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 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 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 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;
}
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, ...)
...