C# 使用“搜索”按钮使用多个文本框值搜索SQL Server数据库
如果我在id文本字段中输入值,我只能从数据库中获取条目,但是当我在其他文本字段中输入任何内容时,如果我确定它们在其中,我就不会得到任何结果 这是我的密码:C# 使用“搜索”按钮使用多个文本框值搜索SQL Server数据库,c#,sql,visual-studio,visual-studio-2013,C#,Sql,Visual Studio,Visual Studio 2013,如果我在id文本字段中输入值,我只能从数据库中获取条目,但是当我在其他文本字段中输入任何内容时,如果我确定它们在其中,我就不会得到任何结果 这是我的密码: protected void SearchButton_Click(object sender, EventArgs e) { String commandString = "SELECT * FROM [Swim] WHERE (([First Name] LIKE '%' + @First_Name + '%') AND ([La
protected void SearchButton_Click(object sender, EventArgs e)
{
String commandString = "SELECT * FROM [Swim] WHERE (([First Name] LIKE '%' + @First_Name + '%') AND ([Last Name] LIKE '%' + @Last_Name + '%') AND ([Phone] LIKE '%' + @Phone + '%') AND ([id] = @id))";
//SELECT * FROM [Swim] WHERE ([Phone] LIKE '%' + @Phone + '%')
SqlCommand command = new SqlCommand(commandString, conn);
command.Parameters.Add("@First_Name", SqlDbType.NVarChar).Value = FirstNameTextBox.Text;
command.Parameters.Add("@Last_Name", SqlDbType.NVarChar).Value = LastNameTextBox.Text;
command.Parameters.Add("@id", SqlDbType.NVarChar).Value = IdTextBox.Text;
command.Parameters.Add("@phone", SqlDbType.NVarChar).Value = PhoneTextBox.Text;
conn.Open();
command.ExecuteNonQuery();
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = command;
da.Fill(ds);
GridView1.DataSource = ds;
GridView1.DataBind();
conn.Close();
}
有什么建议会有帮助吗?试试这个:
从以下位置选择*选项:第一个名字(如“%”++@First_Name++“%”和最后一个名字(如“%”++@Last_Name++“%”)和电话(如“%”++@Phone++“%”)或id=@id > P>认真考虑使用实体框架之类的东西,而不是在代码中MunSQL SQL文本。 我猜测您希望允许对一个或多个字段进行查询 要使用实体框架和LINQ查询满足您的需求,您需要执行以下操作:
var query = db.Swims;
// ID overrides all others, since it is unique no point adding more filters unless
// you want to not return the row if the other filters don't match?
if (IdTextBox.Text.Length > 0)
{
int id = Convert.ToInt32(IdTextBox.Text);
query = query.Where(s => s.Id == id);
}
else
{
if (FirstNameTextBox.Text.Length > 0)
{
query = query.Where(s => s.FirstName.Contains(FirstNameTextBox.Text));
}
if (LastNameTextBox.Text.Length > 0)
{
query = query.Where(s => s.LastName.Contains(LastNameTextBox.Text));
}
if (PhoneTextBox.Text.Length > 0)
{
query = query.Where(s => s.Phone.Contains(PhoneTextBox.Text));
}
}
GridView1.DataSource = query.ToList();
以上内容将毫无问题地处理所有8种左右的查询组合
我在这里做了一些假设,这些假设在您的问题中没有明确说明,如果我有任何错误,请告诉我,我会相应地更新答案。首先,我建议尽可能将其放入sql存储过程中。这更多的是个人偏好,因为我更倾向于数据库。当我们在应用程序层和数据库层之间编写代码时,重构存储的过程(如果必须的话)要容易得多,在这两者之间存储/检索数据对我来说也要容易得多 如果您感兴趣,我可以发布一个示例,说明如何使用c&a存储过程来实现这一点 至于你的问题。。不应该这样:command.ExecuteNonQuery;这是command.ExecuteQuery吗
我使用command.ExecuteOnQuery将更新/信息发送到数据库层,使用command.ExecuteQuery将信息拉到应用层 首先,我建议您阅读SQL注入攻击以及如何使用参数化查询来避免这些攻击!