Maison > Questions et réponses > le corps du texte
J'essaie de rechercher dans ma base de données en utilisant une procédure stockée via mon programme. Le but est d'effectuer une recherche en utilisant l'un des trois critères saisis. N° d’identification, prénom et/ou nom. J'ai créé la procédure stockée suivante dans MySql :
CREATE DEFINER=`mainuser`@`localhost` PROCEDURE `searchvisitor`( enteredid int, enteredfn varchar(25), enteredln varchar(25) ) begin select visitors.visitorid, visitors.firstname, visitors.lastname, visitors.middleinitial from visitors where visitors.visitorid = enteredid or visitors.firstname like '%enteredfn%' or visitors.lastname like '%enteredln%'; end
Mon code C# est le suivant :
Requête de base de données :
public DataView searchUserQuery(int id, string fn, string ln) { using (MySqlConnection conn = new MySqlConnection(Helper.connVal("ntpantry"))) { conn.Open(); DataTable dt = new DataTable(); string lgquery = "searchvisitor"; MySqlCommand cmd = new MySqlCommand(lgquery, conn); cmd.Connection = conn; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("enteredid", id); cmd.Parameters.AddWithValue("enteredfn", fn); cmd.Parameters.AddWithValue("enteredln", ln); MySqlDataReader dr = cmd.ExecuteReader(); dt.Load(dr); DataView dv = new DataView(dt); return dv; } }
Requête Bridge (essayez de modifier ou de supprimer une logique supplémentaire en un seul endroit) :
public DataView Searchvisitor() { if (GetVisitor.VisitorFirstName.Length == 0) { GetVisitor.VisitorFirstName = " "; } if (GetVisitor.VisitorLastName.Length == 0) { GetVisitor.VisitorLastName = " "; } return dq.searchUserQuery(Convert.ToInt32(GetVisitor.VisitorID), GetVisitor.VisitorFirstName, GetVisitor.VisitorLastName); }
Appelez après avoir cliqué sur le bouton de recherche :
private void button2_Click(object sender, EventArgs e) { //Add get set to put logic in bridge data instead GetVisitor.VisitorID = Convert.ToInt32(textBox_searchid.Text); GetVisitor.VisitorFirstName = textBox_searchfn.Text; GetVisitor.VisitorLastName = textBox_searchln.Text; data_searchresults.DataSource = bd.Searchvisitor(); DataGridViewColumn columnid = data_searchresults.Columns[0]; columnid.Width = 40; DataGridViewColumn columnfn = data_searchresults.Columns[1]; columnfn.Width = 60; DataGridViewColumn columnln = data_searchresults.Columns[2]; columnln.Width = 60; //was currently working on fixing search results. works for id but not first name or last name. Also results box only shows 2 items }
Si besoin, voici les propriétés que j'utilise :
public class GetVisitor { public static int VisitorID { get; set; } public static string VisitorFirstName { get; set;} public static string VisitorLastName { get; set;} }
Cela fonctionne très bien lors de la recherche d'identifiants ! Mais si j'essaie de rechercher uniquement le prénom et/ou le nom, j'obtiens l'erreur suivante :
System.FormatException: 'Input string was not in a correct format.'
Je pensais que le nom vide provoquait des problèmes de formatage dans les espaces, j'ai donc essayé d'entrer un espace pour ajouter du contenu, mais cela n'a pas fonctionné. Est-ce que cela reviendra à la façon dont ma procédure stockée est configurée ou en code C# ? Je l'ai essayé pendant un moment mais j'ai rencontré des problèmes.
Merci d'avance !
P粉5305192342024-03-20 14:34:57
Il y a presque certainement beaucoup d'informations non pertinentes dans cette question. Cela n'a presque certainement rien à voir avec la base de données ou la requête ou quoi que ce soit d'autre que la conversion de string
en nombre. Vous ne nous avez même pas dit où l'exception a été levée, mais je suppose que c'est ici :
GetVisitor.VisitorID = Convert.ToInt32(textBox_searchid.Text);
if TextBox
不包含 32 位整数的有效表示,则该代码将失败并显示该错误消息。显而易见的解决方案是在将用户输入转换为数字之前验证用户输入。毕竟它是一个 TextBox
, l'utilisateur peut donc saisir n'importe quoi.
Je vous recommande d'abord de tester si l'utilisateur a saisi quelque chose. S'ils ne le font pas, vous pouvez supposer qu'ils n'ont pas essayé de rechercher par pièce d'identité et agir en conséquence. La manière dont vous procédez dépend de vous, mais je le ferais complètement différemment. Mais cela dépasse le cadre de cette question. S'ils ont saisi quelque chose, vous devez vérifier s'il s'agit d'un numéro valide et arrêter sinon. Ce n'est que dans ce cas que vous devez continuer. La méthode TryParse
de n'importe quel type numérique (et quelques autres) peut être vérifiée et convertie en une seule étape, par ex.
if (textBox_searchid.TextLength == 0) { // No ID entered } else if (int.TryParse(textBox_searchid.Text, out var id)) { // Use id here } else { // Invalid ID entered }