尝试基于任何输入的搜索条件通过C#搜索SQL数据库时,出现输入字符串格式不正确的错误
P粉327903045
P粉327903045 2024-03-20 00:15:39
0
1
480

我正在尝试通过我的程序使用存储过程搜索我的数据库。其目标是使用输入的三个条件中的任何一个进行搜索。 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粉327903045
P粉327903045

全部回复(1)
P粉530519234

几乎可以肯定,这个问题中有很多不相关的信息。几乎可以肯定,这与数据库或查询或除了将 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
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板