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