在SQL Query中包含文本框值

时间:2014-05-15 09:17:08

标签: c# sql textbox visual-studio-2013

我正在尝试使用文本框和搜索按钮搜索GridView。我想我需要一个类似

的查询
SELECT employeeID, name, position, hourlyPayRate 
FROM dbo.employee 
WHERE name LIKE 'textBox1.text+'

我使用visual studio 2013中的查询设计器进行了查询。

然后我有一个像这样的事件处理程序

private void btnSearch_Click(object sender, EventArgs e)
{            
    this.employeeTableAdapter.FillBy(this.personnelDataSet.employee); 
}

我确信问题出在查询中,但我不知道如何将文本框的值包含在查询中。

5 个答案:

答案 0 :(得分:1)

要更改您的查询,它应该如下所示:

string textboxValue = textbox1.Text;
string query = "SELECT employeeID, name, position, hourlyPayRate " +
               "FROM dbo.employee " +
               "WHERE name LIKE '" + textboxValue + "'";

但这很容易受到SQL注入攻击,你应该使用SqlCommand parameters

string commandText = "SELECT employeeID, name, position, hourlyPayRate " +
                     "FROM dbo.employee WHERE name LIKE '%'+ @Name + '%'";

using (SqlConnection connection = new SqlConnection(connectionString))
{
    //Create a SqlCommand instance
    SqlCommand command = new SqlCommand(commandText, connection);
    //Add the parameter
    command.Parameters.Add("@Name", SqlDbType.VarChar, 20).Value = textbox1.Text;

    //Execute the query
    try
    {
        connection.Open();
        command.ExecuteNonQuery();
    }
    catch
    {
        //Handle exception, show message to user...
    }
    finally
    {
        connection.Close(); 
    }
}

<强>更新

要在点击按钮时执行此代码,请将代码放在此处(确保您有一个名为YourButton的按钮):

private void YourButton_Click(object sender, EventArgs e)
{
    //Place above code here
}

<强> UPDATE2:

您应该在SqlConnection中使用连接字符串,此字符串可能类似于:

string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";

在这里,您必须将以my开头的值替换为您自己的值。有关SQL Server的连接字符串的更多信息/示例:

答案 1 :(得分:1)

正如makambi已经说过的那样。你不应该那样做,因为你正在打开SQL注入的大门。而是使用这样的参数化查询:

SqlCommand cmd = new SqlCommand("SELECT employeeID, name, position, hourlyPayRate FROM dbo.employee WHERE name LIKE @name", connection);

cmd.Parameters.Add("@name", textBox1.Text);
connection.Open();
cmd.ExecuteNonQuery();

或使用存储过程。

答案 2 :(得分:1)

作为未成年人;这是一个有效的方法,展示了如何避免DataTable等的开销,以及简单但安全有效的参数化和实现:

public class Employee {
    public int EmployeeID {get;set;}
    public string Name {get;set;}
    public string Position {get;set;}
    public decimal HourlyPayRate {get;set;}
}
...
// uses the "dapper" tool to provide the Query<T> extension method;
// freely available from NuGet: PM> Install-Package Dapper
var employees = connection.Query<Employee>(@"
SELECT employeeID, name, position, hourlyPayRate 
FROM dbo.employee 
WHERE name LIKE @pattern",
    new { pattern = "%" + textBox1.Text + "%" }).ToList();

grid.DataSource = employees;

答案 3 :(得分:0)

如果我理解正确,你手动构建你的SQL查询。使用纯字符串连接执行此操作是一种不好的做法,因为它可以进行SQL注入,而应该使用SqlCommand语法并在其中添加SqlParameters。

   using (var sqlConnection = new SqlConnection("connection"))
   {
       var commandText = "SELECT employeeID, name, position, hourlyPayRate FROM dbo.employee WHERE name LIKE @name";

       using (var sqlCommand = new SqlCommand(commandText, sqlConnection))
       {
             sqlCommand.Parameters.Add("@salary", SqlDbType.Money).Value = textBox1.text;
       }
   }

它没有经过实际测试,它可能无法正常工作,但它描述和想法。您只需添加所需的sql类型的参数,请在此处查看更多示例:When should "SqlDbType" and "size" be used when adding SqlCommand Parameters?

答案 4 :(得分:0)

where子句应该是WHERE name LIKE textBox1.text +'rest of query'

但是正如makambi所提到的那样,你构建查询的方式可以打开你的sql注入