[ASP.NET] SQL Helper

Pagina: 1
Acties:

  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
Ik ben bezig met het Data Access Application Block van Microsoft in C#. Nu krijg ik de foutmelding "Parameter count does not match Parameter Value count" terwijl ik toch echt 4 parameters in de stored procedure opvraag. Heeft iemand een idee hoe dit kan?

C# code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//Get the form field values and put them into parameter objects
SqlParameter SqlParameters1 = new SqlParameter("iPageId", lblHiddenPageId.Text);
SqlParameter SqlParameters2 = new SqlParameter("sPageHTML", EasyWebEdit1.HTMLValue);
SqlParameter SqlParameters3 = new SqlParameter("sPageName", txtbxPageName.Text);
SqlParameter SqlParameters4 = new SqlParameter("iMenuTabId", ddMenuItem.SelectedValue.ToString());

//Fill an array with the paramteres to pass it into the SQLHelper
ArrayList arrParameters = new ArrayList();
arrParameters.Add(SqlParameters1);
arrParameters.Add(SqlParameters2);
arrParameters.Add(SqlParameters3);
arrParameters.Add(SqlParameters4);

txtbxPageName.Text = arrParameters.Count.ToString();

//try 
//{
    SqlHelper.ExecuteScalar(GetConnectionString(), "insertOrUpdatePage", arrParameters);
//}
//finally 
//{
//  Response.Redirect("viewdynamicpages.aspx");
//}


SQL Stored Procedure:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE PROCEDURE insertOrUpdatePage 
  @iPageId int,
  @sPageHTML ntext
  @sPageName nvarchar(50),
  @iMenuTabId int
AS
if @iPageId = '' GOTO E_Insert
if @iPageId <> '' GOTO E_Update

E_Insert:
    insert into tb_page (sPageHTML, sPageName, iMenuTabId) Values (@sPageHTML, @sPageName, @iMenuTabId)
    GOTO CleanUp
    
E_Update:
    update tb_page set sPageHTML = @sPageHTML, sPageName = @sPageName,
    iMenuTabId = @iMenuTabId Where iPageId = @iPageId
    GOTO CleanUp
    
CleanUp:
    return
GO

[ Voor 5% gewijzigd door UniCache2 op 14-01-2004 15:44 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Je voegt je ParameterCollection blijkbaar niet toe aan je SqlHelper object.

https://fgheysels.github.io/


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
Hier toch?

SqlHelper.ExecuteScalar(GetConnectionString(), "insertOrUpdatePage", arrParameters);

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Hmm, ok. Had ik niet gezien.

Echter, ik zie iets anders:
In je SP beginnen je parameters met een @. Dat moet in je C# programma ook zo zijn:
code:
1
SqlParameter p1 = new SqlParameter("@iPageId", ....);

https://fgheysels.github.io/


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
Ok dank je, heb ik geprobeerd, krijg dezelfde foutmelding.

offtopic:
Volgens mij gebruikt de SQLHelper overigens de volgorde waarop de parameters in de SP gepassed worden, en niet hun echte naam, dus die naam doet er niet echt toe, weet ik echter niet zeker..

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
UniCache2 schreef op 14 januari 2004 @ 15:48:
offtopic:
Volgens mij gebruikt de SQLHelper overigens de volgorde waarop de parameters in de SP gepassed worden, en niet hun echte naam, dus die naam doet er niet echt toe, weet ik echter niet zeker..
In OleDb wordt er idd gekeken naar de volgorde, want daar moet je ze in de juiste volgorde toevoegen aan je command object. Bij SqlClient dacht ik dat er naar de naam gekeken werd.

Je foutmelding gaat trouwens over de 'Value-Count'. Ben je zker dat je iedere parameter een waarde hebt gegeven, en dat je bij NULL - values DBNull.Value gebruikt?

[ Voor 15% gewijzigd door whoami op 14-01-2004 15:50 ]

https://fgheysels.github.io/


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
Ok, het werkt echter nog steeds niet ;)

  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
whoami schreef op 14 januari 2004 @ 15:49:
[...]

Je foutmelding gaat trouwens over de 'Value-Count'. Ben je zker dat je iedere parameter een waarde hebt gegeven, en dat je bij NULL - values DBNull.Value gebruikt?
Ik heb nu 4x:

SqlParameter SqlParameters1 = new SqlParameter("iPageId", "1");

Waarmee ik dus testwaarden simuleer, maar dit werkt nog steeds niet, zelfde foutmelding... vreemd

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Aan een Integer parameter moet je dan ook geen string toekennen:

code:
1
2
3
SqlParameter p1 = new SqlParameter("@iPageId", 1);
SqlParameter p2 = new SqlParameter("@sPageText", "blaat");
...

https://fgheysels.github.io/


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
whoami schreef op 14 januari 2004 @ 15:54:
Aan een Integer parameter moet je dan ook geen string toekennen:

code:
1
2
3
SqlParameter p1 = new SqlParameter("@iPageId", 1);
SqlParameter p2 = new SqlParameter("@sPageText", "blaat");
...
Zo ver was ik nog net wel idd ;)

code:
1
2
3
4
SqlParameter SqlParameters1 = new SqlParameter("iPageId", 1);
SqlParameter SqlParameters2 = new SqlParameter("sPageHTML", "1");
SqlParameter SqlParameters3 = new SqlParameter("sPageName", "1");
SqlParameter SqlParameters4 = new SqlParameter("iMenuTabId", 1);

Geeft dezelfde fout

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Je exception wordt door deze code gethrowed:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
protected void AssignParameterValues(IDbDataParameter[] commandParameters, object[] parameterValues)
        {
if ((commandParameters == null) || (parameterValues == null)) 
{
    // Do nothing if we get no data
    return;
}

// We must have the same number of values as we pave parameters to put them in
if (commandParameters.Length != parameterValues.Length)
{
    throw new ArgumentException("Parameter count does not match Parameter Value count.");
}
....


Ben je wel zeker dat je de juiste SP oproept, moet je ook het CommandType niet aangeven (CommandType.StoredProcedure), etc.....
Ik heb zelf nog niet met dat Application Block gewerkt.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 12:18

gorgi_19

Kruimeltjes zijn weer op :9

@ whoami: Als ik die void zo bekijk, is het logisch dat hij een exception throwed. Je voert maar 1 object toe (1 arraylist), terwijl er 4 objecten verwacht worden.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// Initialize the connection string and command text
// These will form the key used to store and retrieve the parameters
const string CONN_STRING =
  "SERVER=(local); DATABASE=Northwind; INTEGRATED SECURITY=True;";
string spName = "SELECT ProductName FROM Products " + 
                "WHERE Category=@Cat AND SupplierID = @Sup";

//Cache the parameters
SqlParameter[] paramsToStore = new SqlParameter[2];
paramsToStore[0] = New SqlParameter("@Cat", SqlDbType.Int);
paramsToStore[1] = New SqlParameter("@Sup", SqlDbType.Int);
SqlHelperParameterCache.CacheParameterSet(CONN_STRING, 
                                          sql, 
                                          paramsToStore);

//Retrieve the parameters from the cache
SqlParameter storedParams = new SqlParameter[2];
storedParams = SqlHelperParameterCache.GetCachedParameterSet(
                                              CONN_STRING, sql);
storedParams(0).Value = 2;
storedParams(1).Value = 3;

//Use the parameters in a command
DataSet ds;
ds = SqlHelper.ExecuteDataset(CONN_STRING, 
                              CommandType.StoredProcedure,
                              sql, storedParams);

Bron:
http://www.msdnaa.net/Resources/Display.aspx?ResID=1433

Hier wordt een array aangemaakt. En een array is niet hetzelfde als een arraylist, afaik.

[ Voor 86% gewijzigd door gorgi_19 op 14-01-2004 16:09 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
Die exception had ik idd al gevonden op internet. Ik roep de juiste sp aan, dat weet ik zeker.

Verder meer info over SQLHelper.ExecuteScalar:

public static System.Object ExecuteScalar ( System.String connectionString , System.String spName , params object[] parameterValues )
Member of Microsoft.ApplicationBlocks.Data.SqlHelper

Summary:
Execute a stored procedure via a SqlCommand (that returns a 1x1 resultset) against the database specified in the connection string using the provided parameter values. This method will query the database to discover the parameters for the stored procedure (the first time each stored procedure is called), and assign the values based on parameter order.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
UniCache2 schreef op 14 januari 2004 @ 15:58:
[...]


Zo ver was ik nog net wel idd ;)

code:
1
2
3
4
SqlParameter SqlParameters1 = new SqlParameter("iPageId", 1);
SqlParameter SqlParameters2 = new SqlParameter("sPageHTML", "1");
SqlParameter SqlParameters3 = new SqlParameter("sPageName", "1");
SqlParameter SqlParameters4 = new SqlParameter("iMenuTabId", 1);

Geeft dezelfde fout
Je gebruikt hier nog steeds geen @ tekens voor je namen. Ik denk dat het daar inderdaad mis gaat. Mischien ziet hij ze daarom niet als parameters ofzo.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 12:18

gorgi_19

Kruimeltjes zijn weer op :9

rwb schreef op 14 januari 2004 @ 16:10:
[...]

Je gebruikt hier nog steeds geen @ tekens voor je namen. Ik denk dat het daar inderdaad mis gaat. Mischien ziet hij ze daarom niet als parameters ofzo.
Voor zover ik zie komt hij nog niet eens zover :) Dat zou wel het volgende zijn waar hij op crashed.. :P

[ Voor 9% gewijzigd door gorgi_19 op 14-01-2004 16:11 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Hmmm, je passed een ArrayList, terwijl er wel degelijk een array verwacht wordt, blijkbaar van enkel de values.

code:
1
blaat.ExecuteScalar(connString, "procname", new object[] {1, "test", "blaat", 2});

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
gorgi_19 schreef op 14 januari 2004 @ 16:11:
[...]

Voor zover ik zie komt hij nog niet eens zover :) Dat zou wel het volgende zijn waar hij op crashed.. :P
Dat zou inderdaad kunnen. Moet je niet een parameter lijst toevoegen in plaats van een arraylist dus ongeveer zo

C#:
1
SqlHelper.ExecuteScalar(GetConnectionString(), "insertOrUpdatePage", SqlParameters1, SqlParameters2, SqlParameters3, SqlParameters4);

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
Hi guys, thanx, dat van die "@" was gewoon een stom copy paste foutje, maar maakt overigens niets uit, ik heb het even opgezocht en hij gebruikt gewoon de volgorde van de parameter input.

Ik heb er een array van gemaakt en dit werkt inderdaad wel, raar dat ie een arraylist niet pakt, of niet?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 12:18

gorgi_19

Kruimeltjes zijn weer op :9

Je moet idd een array toevoegen, als ik de method goed heb gezien. Alleen kan je volgens mij zo geen array toevoegen.
Ik heb er een array van gemaakt en dit werkt inderdaad wel, raar dat ie een arraylist niet pakt, of niet?
Nee, da's logisch. Een array is niet hetzelfde als een arraylist.

[ Voor 45% gewijzigd door gorgi_19 op 14-01-2004 16:15 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Of:
code:
1
blaat.ExecuteScalar(connectionstring, "procname", new SqlParameter[] {p1, p2, p3, p4});

https://fgheysels.github.io/


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
rwb schreef op 14 januari 2004 @ 16:13:
[...]

Dat zou inderdaad kunnen. Moet je niet een parameter lijst toevoegen in plaats van een arraylist dus ongeveer zo

C#:
1
SqlHelper.ExecuteScalar(GetConnectionString(), "insertOrUpdatePage", SqlParameters1, SqlParameters2, SqlParameters3, SqlParameters4);
Heb ik ook even geprobeerd en werkt idd ook, raar, zo'n constructie heb ik nog nooit gezien :o

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
UniCache2 schreef op 14 januari 2004 @ 16:13:
Ik heb er een array van gemaakt en dit werkt inderdaad wel, raar dat ie een
arraylist niet pakt, of niet?
Niet raar.
Een arraylist gebruikt wel intern een array, maar is geen array.
(Composition ipv inheritance).

https://fgheysels.github.io/


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
allright, weer wat geleerd, thanx voor de snelle replies.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dat je meerdere parameters mee kunt geven komt omdat in de array met parameters gedeclareerd is als params dus zoals dit
code:
1
public void MyMethod( int a, int b, params int[] c );


Dit betekend dat de compiler de laatste parameters van je procedure call automatisch naar een array converteerd.

Je kan dan de methode op de volgende 2 manieren aanroepen

C#:
1
2
3
MyMethod( 1, 2, 3, 4, 5, 6 );
//of
MyMethod( 1, 2, new int[] { 3, 4, 5, 6 } );


Dit wordt beide door de compiler naar hetzelfde vertaald.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • UniCache2
  • Registratie: Januari 2001
  • Laatst online: 02-03 09:30
rwb schreef op 14 januari 2004 @ 16:25:
Dat je meerdere parameters mee kunt geven komt omdat in de array met parameters gedeclareerd is als params dus zoals dit
code:
1
public void MyMethod( int a, int b, params int[] c );


Dit betekend dat de compiler de laatste parameters van je procedure call automatisch naar een array converteerd.

Je kan dan de methode op de volgende 2 manieren aanroepen

C#:
1
2
3
MyMethod( 1, 2, 3, 4, 5, 6 );
//of
MyMethod( 1, 2, new int[] { 3, 4, 5, 6 } );


Dit wordt beide door de compiler naar hetzelfde vertaald.
Aha ok interessant, maar wat gebeurd er dan als je dit hebt:

public void MyMethod( int a, params int[] b, params int[] c ); ??

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
UniCache2 schreef op 14 januari 2004 @ 17:20:
[...]


Aha ok interessant, maar wat gebeurd er dan als je dit hebt:

public void MyMethod( int a, params int[] b, params int[] c ); ??
Test het ff uit, dan weet je het. ;)

Je krijgt een compiler - error:
A params parameter must be the last parameter in a formal parameter list

https://fgheysels.github.io/

Pagina: 1