/RED
Ursäkta mig... Den nedersta är till en parameteriserad fråga... den övre är till en stored procedure.
21 svar · 738 visningar · startad av Vinnaren
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
/RED
Ursäkta mig... Den nedersta är till en parameteriserad fråga... den övre är till en stored procedure.
Jag tänkte fel, rätt svar står i förra inlägget.
ok, men kan man inte anv stored procedure i en SqlCommand??
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);
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))
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
Hur ser din procedure ut då?
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
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
tack, men det fungerade tyvärr inte häller :(
Får väll anv SqlDataAdapter då ingen annan vill fungera :l
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?
håller med Zaiman, ett bättre ord vore spDeleteDETDUTARBORT ;)
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
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
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)
}
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, ...)
...