C# ';靠近'的语法不正确;2'';

C# ';靠近'的语法不正确;2'';,c#,sql,select,C#,Sql,Select,我正在尝试从gridview中基于sql的用户输入和显示中检索行数 请帮忙 Int32 text = Convert.ToInt32(this.Txtusers.Text); con.Open(); cmd = new SqlCommand("select TOP '" + text + "' * from Avaya_Id where LOB = '" + DDLOB.SelectedItem.Value + "' and Status = 'Unassigned'", con); SqlDa

我正在尝试从gridview中基于sql的用户输入和显示中检索行数

请帮忙

Int32 text = Convert.ToInt32(this.Txtusers.Text);
con.Open();
cmd = new SqlCommand("select TOP '" + text + "' * from Avaya_Id where LOB = '" + DDLOB.SelectedItem.Value + "' and Status = 'Unassigned'", con);
SqlDataReader rdr = cmd.ExecuteReader();
GridView1.DataSource = rdr;
GridView1.DataBind();
con.Close();

下面是应该如何写的

int text;
if(int.TryParse(this.Txtusers.Text, out text)
{
    using(var con = new SqlConnection(connectionString)
    {
        using(var cmd  = new SqlCommand("select TOP (@top) * from Avaya_Id where LOB = @LOB and Status = 'Unassigned'", con))
        {
            cmd.Parameters.Add("@top", SqlDbType.Int).Value = text;
            cmd.Parameters.Add("@LOB", SqlDbType.Int).Value = DDLOB.SelectedItem.Value;
            con.Open();
            using(var rdr = cmd.ExecuteReader())
            {
                GridView1.DataSource = rdr;
                GridView1.DataBind();
            }
        }
    }
}
关注点:

  • 使用参数来避免Sql注入的风险
  • Convert.ToInt32
    更改为
    int.TryParse
    。永远不要相信用户的输入
  • 对实现
    IDisposable
    接口的每个实例使用
    using
    语句
  • 请注意,使用
    top x
    而不使用
    order by
    子句意味着您从数据库中获得x条任意记录,因为数据库表本质上是无序的,确保从
    select
    语句返回的行顺序的唯一方法是使用
    order by
    子句

请注意,我猜第二个参数是int,如果不是,请更改数据类型。

打印
cmd
并将其包含在问题中。
选择顶部“2”…
应该是
选择顶部2…
(不带引号)以类型1结尾
TOP
需要一个数字,但可以在单引号中设置
text
。2.您的代码对用户开放。请使用参数化查询,而不是将用户输入直接放入查询字符串中!如果使用,可以将参数参数化为
TOP
,如和所示。另请参见,以了解为什么应始终使用参数化SQL查询,而不是使用用户输入直接构造查询。