Heim > Fragen und Antworten > Hauptteil
Ich versuche, meine Datenbank mithilfe einer gespeicherten Prozedur in meinem Programm zu durchsuchen. Das Ziel besteht darin, anhand eines der drei eingegebenen Kriterien zu suchen. ID#, Vorname und/oder Nachname. Ich habe die folgende gespeicherte Prozedur in MySql erstellt:
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
Mein C#-Code lautet wie folgt:
Datenbankabfrage:
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; } }
Bridge-Abfrage (versuchen Sie, zusätzliche Logik an einer Stelle zu bearbeiten oder zu entfernen):
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); }
Nach dem Klicken auf die Suchschaltfläche anrufen:
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 }
Bei Bedarf verwende ich folgende Eigenschaften:
public class GetVisitor { public static int VisitorID { get; set; } public static string VisitorFirstName { get; set;} public static string VisitorLastName { get; set;} }
Es funktioniert hervorragend bei der Suche nach Ausweisen! Wenn ich jedoch versuche, nur nach Vor- und/oder Nachnamen zu suchen, erhalte ich die folgende Fehlermeldung:
System.FormatException: 'Input string was not in a correct format.'
Ich dachte, dass der leere Name zu Formatierungsproblemen im Leerraum führt, also habe ich versucht, ein Leerzeichen einzugeben, um etwas Inhalt hinzuzufügen, aber es hat nicht funktioniert. Wird es darauf zurückkommen, wie meine gespeicherte Prozedur eingerichtet ist oder in C#-Code? Ich habe es eine Weile versucht, bin aber auf Probleme gestoßen.
Vielen Dank im Voraus!
P粉5305192342024-03-20 14:34:57
几乎可以肯定,这个问题中有很多不相关的信息。几乎可以肯定,这与数据库或查询或除了将 string
转换为数字之外的任何内容无关。您甚至没有告诉我们异常在哪里抛出,但我猜它就在这里:
GetVisitor.VisitorID = Convert.ToInt32(textBox_searchid.Text);
如果 TextBox
不包含 32 位整数的有效表示,则该代码将失败并显示该错误消息。显而易见的解决方案是在将用户输入转换为数字之前验证用户输入。毕竟它是一个 TextBox
,因此用户可能会输入任何内容。
我建议您首先测试用户是否输入了任何内容。如果他们没有,那么您可以假设他们没有尝试通过 ID 进行搜索并进行相应操作。如何做到这一点取决于你自己,但我会采取完全不同的做法。但这超出了这个问题的范围。如果他们输入了某些内容,那么您应该检查它是否是有效的数字,如果不是则停止。只有在这种情况下您才应该继续。任何数值类型(以及其他一些)的 TryParse
方法都可以一步完成验证和转换,例如
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 }