如何将文本框参数传递给SQL适配器语句?

时间:2019-04-25 07:54:33

标签: c# sql

我有一个TextBox,用户将在其中输入表的名称,并将其传递到查询中。该查询将从数据库中提取数据并将其显示在数据表上。

但是我似乎无法使用SqlAdapter来做到这一点,当我可以轻松添加参数并将其传递时,总是会遇到类似executescalar的错误。

  

“ @ a”附近的语法不正确。说明:未处理的异常   在执行当前Web请求期间发生。请   查看堆栈跟踪以获取有关错误以及位置的更多信息。   它起源于代码。

     

异常详细信息:System.Data.SqlClient.SqlException:不正确   “ @a”附近的语法。

     

源错误:

     

第58行:Adapt.SelectCommand.Parameters.AddWithValue(“ @ a”,   “%” + Selectdb.Text +“%”);第59行:DataTable dt =新   DataTable();第60行:adapt.Fill(dt);第61行:
  if(dt.Rows.Count> 0)第62行:{

protected void btn_selectdb_Click(object sender, EventArgs e)
{
    Label1.Text = "ready";

    con = new SqlConnection(constr);
    con.Open();
    string a = Convert.ToString(Selectdb.Text);
    string cmdstr = "Select userid,username,email,eventname from @a";
    SqlCommand cmd = new SqlCommand(cmdstr, con);

    SqlDataAdapter adapt = new SqlDataAdapter(cmd);
    adapt.SelectCommand.Parameters.AddWithValue("@a", "%" + Selectdb.Text + "%");
    DataTable dt = new DataTable();
    adapt.Fill(dt);
    if (dt.Rows.Count > 0)
    {
        GridView1.DataSource = dt;
        GridView1.DataBind();
    }

    con.Close();
}

2 个答案:

答案 0 :(得分:2)

不能表名作为查询参数(不同的表名意味着不同的查询,而不是具有不同参数的同一查询)。但是,您可以尝试格式化(或字符串插值):

    //TODO: validate Selectdb.Text: we don't want SQL injection, e.g.
    // Selectdb.Text = "MyTable; delete from OtherTable"
    if (!Regex.IsMatch(Selectdb.Text, "^[A-Za-z0-9_]+$")) {
      //Something wrong with Selectdb.Text - is it a real table?
    }

    using (con = new SqlConnection(constr)) {
      con.Open();

      string cmdstr = 
        $@"select userid,
                  username,
                  email,
                  eventname 
             from [{Selectdb.Text}]"; 

      using (SqlCommand cmd = new SqlCommand(cmdstr, con)) {
        SqlDataAdapter adapt = new SqlDataAdapter(cmd);

        DataTable dt = new DataTable();
        adapt.Fill(dt);

        if (dt.Rows.Count > 0) {
          GridView1.DataSource = dt;
          GridView1.DataBind();
        }
      } 
    }

答案 1 :(得分:-1)

您不应将表名包装在%%中。然后它就有工作的机会。

无论如何,我只会做

string cmdstr = "Select userid,username,email,eventname from [" + Selectdb.Text + "]";