尝试根据输入的任何搜索条件通过 C# 搜索 SQL 数据库,获取输入字符串的格式不正确

Trying to search a SQL database via C# based on any search criteria entered, Getting Input string was not in a correct format

我正在尝试通过我的程序使用存储过程搜索我的数据库。目标是使用输入的三个条件中的任何一个进行搜索。 ID#、名字、and/or 姓氏。我在 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.'

我的想法是名称为空,导致它在任何留空的地方都有格式问题,所以我尝试输入 space 来添加一些东西,但它没有用。它会回到我的存储过程是如何设置的还是在 C# 代码中?我尝试了一段时间,但遇到了问题。

提前致谢!

几乎可以肯定,该问题中包含大量不相关的信息。这几乎肯定与数据库或查询无关,或者除了将 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
}