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

时间:2013-03-10 18:07:57

标签: c#

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();
}

2 个答案:

答案 0 :(得分:0)

这更像是一个评论,但在允许评论的空间中要解决的问题太多了。首先,谁是这段代码的最终用户?它纯粹是内部的还是严格限制的?因为你让自己暴露于SQL Injection攻击。

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

注意:要考虑的一件重要事情是您要完成的任务。无论你追求什么,我都无法想象一个场景,其中N个名字输入的N行表是一个很好的设计。

答案 1 :(得分:0)

人们不能经常这么说,特别是因为它在.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);