使用搜索按钮搜索具有多个文本框值的SQL Server数据库

时间:2014-01-23 23:27:05

标签: 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 ([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();
}

任何建议都有帮助吗?

3 个答案:

答案 0 :(得分:1)

认真考虑使用类似于Entity Framework的内容,而不是在代码中添加SQL文本。

我在这里猜测你想允许对一个或多个字段进行查询。

要使用Entity Framework满足您的要求并使用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个左右的查询组合而没有问题。

我在这里做了一些未在你的问题中明确说明的假设,让我知道如果我有任何错误,我会相应地更新答案。

答案 1 :(得分:0)

试试这个:

SELECT * FROM Swim WHERE(First_Name LIKE'%'+ @ First_Name +'%'AND Last_Name LIKE'%'+ @Last_Name +'%'和Phone LIKE'%'+ @Phone +'%')或( id = @id));

答案 2 :(得分:0)

首先,我建议将(如果可能的话)放入sql存储过程中。这更像是个人偏好,因为我更多的是在数据库方面。当我们在应用程序层和数据库层之间编写代码时,如果你必须更容易(对我来说)在两者之间存储/检索数据,那么重构存储过程就容易得多。

如果您有兴趣,我可以发布一个示例,说明如何使用c#&存储过程

至于你的问题..不应该这样:command.ExecuteNonQuery();是这样的:command.ExecuteQuery?

我使用command.ExecuteNonQuery将更新/信息发送到数据库层,并使用command.ExecuteQuery将信息提取到应用程序层。