我有一个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();
}
答案 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 + "]";