Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用“搜索”按钮使用多个文本框值搜索SQL Server数据库_C#_Sql_Visual Studio_Visual Studio 2013 - Fatal编程技术网

C# 使用“搜索”按钮使用多个文本框值搜索SQL Server数据库

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

如果我在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();
}
有什么建议会有帮助吗?

试试这个:


从以下位置选择*选项:第一个名字(如“%”++@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注入攻击以及如何使用参数化查询来避免这些攻击!