[C#] MySqlDataAdapter parameters/query controlleren

Pagina: 1
Acties:

  • Gehakt
  • Registratie: Juli 2002
  • Laatst online: 24-10 20:19
Ik ben een beetje aan het stoeien met C# en MySQL.
Dit lukt vrij aardig alleen om de een of andere reden doet mijn query het niet meer waar dit eerst wel het geval was.
Als ik de query door de MySQL Query Browser haal doet hij het perfect mits ik voor "?id" uiteraard zelf even een geldige waarde invul.
In mijn applicatie selecteert hij echter wel netjes alle kolommen maar hier staan verder geen gegevens in.
Dit is zeg maar hetzelfde resultaat als dat ik de query uitvoer zonder een geldige waarde voor het id.

C#:
1
2
3
4
5
6
7
8
9
public static void CreateSqlDataAdapter(string naam, int id)
{
    dataAdapter1.MissingSchemaAction = MissingSchemaAction.AddWithKey;
    dataAdapter1.SelectCommand = new MySqlCommand("SELECT * FROM `users` WHERE `users`.`users_id`=?id;", connection);
    dataAdapter1.SelectCommand.Parameters.Add("?id", MySqlDbType.UInt32, id);

    dataAdapter1.Fill(dataSet, "Gegevens");
    return;
}


Theoretisch resultaat bij een ?id van 3:
code:
1
2
3
4
5
6
7
mysql> SELECT * FROM `urenprog`.`users` WHERE `users_id`=3;
+----------+--------------------+------------+
| users_id | name               | birthday   |
+----------+--------------------+------------+
|        3 | sdfsasdasdasddfsdf | 2009-05-20 |
+----------+--------------------+------------+
1 row in set (0.00 sec)

Uiteindelijke resultaat bij een ?id van 3:
code:
1
2
3
+----------+--------------------+------------+
| users_id | name               | birthday   |
+----------+--------------------+------------+


De dataset bind ik op de volgende manier aan een datagrid view:
C#:
1
2
3
dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = Database.dataSet;
dataGridView1.DataMember = "Gegevens";


Ik gebruik de het de bovenstaande code ook om een combobox te vullen en dit gaat wel gewoon goed:
C#:
1
2
3
4
            dataAdapter2 = new MySqlDataAdapter();
            dataAdapter2.MissingSchemaAction = MissingSchemaAction.AddWithKey;
            dataAdapter2.SelectCommand = new MySqlCommand("SELECT `u`.`users_id`, `u`.`name` FROM users u;", connection);
            dataAdapter2.Fill(dataSet, "Names");

Dit gaat gewoon goed maar zoals iedereen wel ziet zitten hier geen parameters in.
Ik heb het zeker wel werkend gehad met daarbij ook de update en delete commando's

Afbeeldingslocatie: http://www.vanweenen.net/~joost/programma.png
Kan iemand mij vertellen waarom het nu fout gaat?
En hoe kan ik controlleren welke query uiteindelijk naar de database gaat?

Als er meer code nodig is hoor ik het wel.

[ Voor 14% gewijzigd door Gehakt op 13-06-2008 01:57 ]


  • Lukse
  • Registratie: Januari 2004
  • Laatst online: 12-04-2023
Bij het toevoegen van de parameter, moet je het vraagteken weglaten.
Doe dus gewoon Parameters.Add("id", ...

  • Gehakt
  • Registratie: Juli 2002
  • Laatst online: 24-10 20:19
Dat werkt niet en ik denk ook niet dat het waar is?
Het volgende komt direct van MySQL zelf:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static MySqlDataAdapter CreateCustomerAdapter(MySqlConnection conn)
{
  MySqlDataAdapter da = new MySqlDataAdapter();
  MySqlCommand cmd;
  MySqlParameter parm;
  // Create the SelectCommand.
  cmd = new MySqlCommand("SELECT * FROM mytable WHERE id=?id AND name=?name", conn);
  cmd.Parameters.Add("?id", MySqlDbType.VarChar, 15);
  cmd.Parameters.Add("?name", MySqlDbType.VarChar, 15);
  da.SelectCommand = cmd;
  // Create the InsertCommand.
  cmd = new MySqlCommand("INSERT INTO mytable (id,name) VALUES (?id,?name)", conn);
  cmd.Parameters.Add("?id", MySqlDbType.VarChar, 15, "id" );
  cmd.Parameters.Add("?name", MySqlDbType.VarChar, 15, "name" );
  
  da.InsertCommand = cmd;  
  return da;
}

Link




Ik heb zelf een kleine test geschreven.
Hieruit blijkt dat dit wel werkt:
C#:
1
2
3
dataAdapter.SelectCommand = new MySqlCommand("SELECT * FROM `users` u WHERE `u`.`users_id`='3';", connection);
//dataAdapter.SelectCommand.Parameters.Add("?id", MySqlDbType.UInt32, 3);
dataAdapter.Fill(dataSet, "Gegevens");

En dit werkt niet:
C#:
1
2
3
dataAdapter.SelectCommand = new MySqlCommand("SELECT * FROM `users` u WHERE `u`.`users_id`=?id;", connection);
dataAdapter.SelectCommand.Parameters.Add("?id", MySqlDbType.UInt32, 3);
dataAdapter.Fill(dataSet, "Gegevens");


*edit na nog wat beter bestuderen kom ik erachter dat ik een domme fout maak.
Het derde argument van Parameters.Add is niet de waarde maar hoe groot de waarde is:
(parameterName, dbtype, size).
De oplossing is de volgende regel code voor de Fill methode.
C#:
1
dataAdapter.SelectCommand.Parameters["?users_id"].Value = 3;

[ Voor 34% gewijzigd door Gehakt op 28-05-2008 23:04 ]


  • Lukse
  • Registratie: Januari 2004
  • Laatst online: 12-04-2023
Gehakt schreef op woensdag 28 mei 2008 @ 22:03:
Dat werkt niet en ik denk ook niet dat het waar is?
Werkt wel hoor, ik gebruik het zelf nl. ook altijd zo :)

Maar om eerlijk te zijn had ik de rest van je code niet echt nagelezen, dacht nl. echt dat met ? niet zou werken.
En ik werk zelf ook nooit met datasets, daarom dat ik de code niet echt uit het hoofd kende om ze op fouten te kunnen controlen.

Maar je bent er uit, dat is het belangrijkste! :)

  • Spiral
  • Registratie: December 2005
  • Niet online
C#:
1
dataAdapter1.SelectCommand.Parameters.Add("?id", MySqlDbType.UInt32).Value = Id;


ipv

C#:
1
dataAdapter1.SelectCommand.Parameters.Add("?id", MySqlDbType.UInt32, id); 


:O

[ Voor 1% gewijzigd door Spiral op 29-05-2008 09:06 . Reden: Moet nog wakker worden en lezen leren, Gehakt had 'm zelf al opgelost namelijk ]

To say of what is that it is not, or of what is not that it is, is false, while to say of what is that it is, and of what is not that it is not, is true. | Aristoteles


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:26
Iets anders; waarom zet je quotes rond die 3, als je je parameter-waarde hard-coded meegeeft ? :?
Het is toch een integer ? Waarom wil je dan nog eens dat je DB gaat casten ... ?

https://fgheysels.github.io/


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Dat trucje zag je ook weleens bij classic asp websites. Op het moment dat je dan geen waarde hebt, dan is de query nog steeds geldig. Je krijgt dan alleen geen resultaat terug.
" where id='' " vs " where id= ".

De TS heeft de parameter in de query zelf niet gequote neergezet.

Ik moet eerlijk zeggen dat ik dergelijke praktijken gelukkig nog niet eerder in asp.net heb gezien.

If it isn't broken, fix it until it is..


  • Gehakt
  • Registratie: Juli 2002
  • Laatst online: 24-10 20:19
Spiral schreef op donderdag 29 mei 2008 @ 09:03:
C#:
1
dataAdapter1.SelectCommand.Parameters.Add("?id", MySqlDbType.UInt32).Value = Id;


ipv

C#:
1
dataAdapter1.SelectCommand.Parameters.Add("?id", MySqlDbType.UInt32, id); 


:O
Hier was ik zelf ondertussen ook al achter. :+ Dit werkt inderdaad stukken sneller.
whoami schreef op donderdag 29 mei 2008 @ 09:15:
Iets anders; waarom zet je quotes rond die 3, als je je parameter-waarde hard-coded meegeeft ? :?
Het is toch een integer ? Waarom wil je dan nog eens dat je DB gaat casten ... ?
Ik heb geen flauw idee waar je het over hebt. :P Zoals jullie misschien al doorhebben hobby ik maar een eind aan en krijg ik hier geen informatica les in ofzo.
Ik denk dat je op deze de volgende regel duid:
C#:
1
dataAdapter.SelectCommand.Parameters["?users_id"].Value = 3;

Dit was maar even als voorbeeld hoe je een waarde kon invullen en hoe ik het dus kon oplossen.
Uiteindelijk moest dit natuurlijk iets als volgt worden:
C#:
1
dataAdapter.SelectCommand.Parameters["?users_id"].Value = id;

of dit wat minder typewerk is:
C#:
1
dataAdapter1.SelectCommand.Parameters.Add("?id", MySqlDbType.UInt32).Value = Id;

[ Voor 22% gewijzigd door Gehakt op 29-05-2008 16:24 ]

Pagina: 1