webForumDet fria alternativet
Logga in / Bli medlem

IDbCommand-parametrar?

.NET

7 svar · 334 visningar · startad av Josef

Medlem sedan mars 20023 561 inlägg
Trådstart#1

Om jag skapar ett IDbCommand-objekt. Hur ska jag då bära mig åt för att kunna lägga till parametrar till det objektet? Får bara felet:

No overload for method 'Add' takes '2' arguments

om man gör så här:

objCmd.Parameters.Add("@url", tbUrl.Text.ToString());

IDbCommand kan tydligen bara ta en in-parameter (IList). Men hur ska jag då göra? :q

Medlem sedan feb. 200435 inlägg
#2

Du ska lägga till ett objekt som representerar en parameter till ett Commandobjekt, det vill säga en instans av en klass som implementerar IDataParameter. Exempelvis SqlParameter.

IDbCommand command = new SqlCommand("namn", connection);
command.Parameters.Add(new SqlParameter("@test",tbUrl.Text.ToString()));

Den kod du angav antagligen funkat om du hade haft en Dataadapter.
typ

adapter.SelectCommand.Parameters.Add("@parameternamn", värde);

Hoppas detta lilla exempel hjälper.

Medlem sedan mars 20023 561 inlägg
#3

Fungerar utmärkt! Tackar! :bire

Men hur ska jag göra här:

SqlParameter param = objCmd.Parameters.Add(new SqlParameter("@identity", SqlDbType.Int));
param.Direction = ParameterDirection.Output;

Jag får felet:

Cannot implicitly convert type 'int' to 'System.Data.SqlClient.SqlParameter'
Medlem sedan mars 20023 561 inlägg
#4

Man får inget felmeddelande om man skriver så här:

SqlParameter param = new SqlParameter("@identity", SqlDbType.Int);
param.Direction = ParameterDirection.Output;

men då fungerar inte som det ska längre... :l

Medlem sedan feb. 200435 inlägg
#5

Du kanske kan visa lite mer kod? Jag gör ett försök att hjälpa dig utan att riktigt fatta problemet :-)

Nedanstående exempel fungerar. Du kanske kan använda det.

using(SqlConnection conn = new SqlConnection(@""))
{
	SqlCommand command = new SqlCommand("testProcedure", conn);
	command.CommandType = CommandType.StoredProcedure;				
	SqlParameter p1 = command.Parameters.Add(new SqlParameter("@fornamn", SqlDbType.VarChar, 255));
	p1.Value = "xxxx";			
	SqlParameter p2  = command.Parameters.Add(new SqlParameter("@identity", SqlDbType.Int, 4));
	p2.Direction = ParameterDirection.Output;					
	conn.Open();
	command.ExecuteNonQuery();				
	int retur = (int)p2.Value; //här tas outputparametern omhand			
}

Och proceduren

CREATE PROCEDURE testProcedure
(
@fornamn varchar(50),
@identity int output
)
AS
INSERT INTO testar (fornamn) values (@fornamn)
set @identity = SCOPE_IDENTITY()

Fråga: Har du lagt till parametern till parametersamlingen i ditt commandobjekt i det fallet där du inte fick något felmeddelande??

Medlem sedan mars 20023 561 inlägg
#6

Ska testa detta lite senare ikväll... Tackar!

Jag tror problemet har att göra med att jag använder IDbCommand och inte SqlCommand, men jag är inte säker. Men ska som sagt testa ditt förslag lite senare ikväll.

Medlem sedan feb. 200435 inlägg
#7

Eftersom du använder interfacen kan du göra på detta sätt istället, vilket också funkar...

using(SqlConnection conn = new SqlConnection(@""))
{
	IDbCommand command = new SqlCommand("testProcedure", conn);				
	command.CommandType = CommandType.StoredProcedure;				
	IDataParameter p1 = new SqlParameter("@fornamn", SqlDbType.VarChar, 255);
	p1.Value = "xxxx";			
	IDataParameter p2  = new SqlParameter("@identity", SqlDbType.Int, 4);
	p2.Direction = ParameterDirection.Output;	
	command.Parameters.Add(p1);
	command.Parameters.Add(p2);					
	conn.Open();
	command.ExecuteNonQuery();				
	int retur = (int)p2.Value;				
}
Medlem sedan mars 20023 561 inlägg
#8

Tackar för hjälpen! :bire

268 ms totalt · 4 externa anrop · v20260731065814-full.51f67c91
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)