我正在尝试通过我的程序使用存储过程搜索我的数据库。其目标是使用输入的三个条件中的任何一个进行搜索。 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# 代码中?我尝试了一段时间,但遇到了麻烦。
提前致谢!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
几乎可以肯定,这个问题中有很多不相关的信息。几乎可以肯定,这与数据库或查询或除了将
string转换为数字之外的任何内容无关。您甚至没有告诉我们异常在哪里抛出,但我猜它就在这里:如果
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 }