如果在sql查询中值是字符串,如何传递表名

本文关键字:何传递 字符串 sql 查询 如果 | 更新日期: 2023-09-27 18:03:25

private void Save_rec_Click(object sender, EventArgs e)
{
    string pattern = ("[''s]+");
    string input = firstname.Text;
    string replacement = "_";
    Regex rgx = new Regex(pattern);
    string result = rgx.Replace(input, replacement);
    msg.Text = result;
    cmd = new SqlCeCommand("create table " + result + "(id int, first_name nVarChar(100))", con);
    cmd.ExecuteNonQuery();
    cmd = new SqlCeCommand("insert into '"+ result +"' values(1,'" + firstname.Text + "')", con);
    cmd.ExecuteNonQuery();
}

如果在sql查询中值是字符串,如何传递表名

这更像是一个注释,但是在允许的注释空间中有太多需要解决的问题。首先,谁是这段代码的最终用户?它纯粹是内在的、受到严格限制的吗?因为你将自己暴露在SQL注入攻击之下。

也就是说,它看起来要执行您想要的操作(创建一个表,然后向该表插入一行),您必须像上面那样使用动态SQL来完成此操作,需要注意的是,在将firstname.Text包含在SQL字符串中之前,您必须对其进行清理。另外,对于insert字符串,应该用[]括起表名,而不是''

注意:要考虑的一个重要问题是你想要完成什么。无论您追求的是什么,我都无法想象这样的场景:N个表的一行中有N个firstname输入,这是一个好的设计。

这种情况不太常见,特别是因为在。net中很容易做到。简单地通过使用SqlCommand参数来防止SQL注入的发生,如下所示:

string strUserInput = TextBox1.Text;
SqlCommand sqlComm = new SqlCommand();
sqlComm.CommandText = "SELECT SomeColumn FROM Table WHERE Name = @ParamName";
SqlParameter param = cmd.Parameters.Add("@ParamName", strUserInput);