我正在尝试通过我的程序使用存储过程搜索我的数据库。其目标是使用输入的三个条件中的任何一个进行搜索。 ID#、名字和/或姓氏。我在 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
我的C#代码如下:
数据库查询:
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; } }
桥接查询(尝试在一个地方编辑或删除额外的逻辑):
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); }
点击搜索按钮后的调用:
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 }
如果需要,这里是我使用的属性:
public class GetVisitor { public static int VisitorID { get; set; } public static string VisitorFirstName { get; set;} public static string VisitorLastName { get; set;} }
搜索 ID 时效果非常好!但如果我尝试只搜索名字和/或姓氏,我会收到以下错误:
System.FormatException: 'Input string was not in a correct format.'
我的想法是,名称为空,导致其在空白处出现格式问题,因此我尝试输入一个空格来添加一些内容,但它不起作用。它会回到我的存储过程的设置方式还是在 C# 代码中?我尝试了一段时间,但遇到了麻烦。
提前致谢!
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 }