我正在为学校创建一个进度跟踪器。
进度跟踪器以线程内的各种线程和标准存储每个学生的分数。
我目前正在计划每个班级(学生)使用一个表格,该表格在每个帖子中存储他们的进度,然后每个线程一个表格,用于存储他们在该线程中每个条件的进度。
我无法知道学校会有多少班级(表格),因此我需要找到一些方法来允许管理员帐户创建具有管理员指定名称的班级(表格)。
我想到的最简单的方法是在创建时使用变量作为表名,但是有更好的方法可以做到这一点吗?
答案 0 :(得分:4)
你可以这样做,但正如D Stanley强调的那样,你不能使用表名参数。因此,如果要将用户的输入用作表名,则无法对用户的输入进行参数化,因此这是一个非常糟糕的主意。这将立即打开你的SQL注入,这从来都不是一个好的计划。
即使对用户输入进行严格的清理,也需要考虑太多的变量,这无疑需要的工作量远远超过预期,并且随着sql的发展,仍然可能容易受到攻击。
我建议您重新提出问题,或者大致了解您的应用尝试实现的目标,看看是否还有其他方法,而不是为每个用户创建一个表格。
<强> 更新 强>
根据您对问题的重写,听起来您需要考虑所需的数据库结构。我很想得到以下表格:
然后,你可以对Progress表进行查询,根据他们的Id,他们的Id和ClassId,或者他们的Id,ClassId和CriteriaId等来取出学生的进度。
在允许管理员创建自己的管理员方面,您只需创建一些查询,允许管理员将学生记录插入Student表,将类插入Class表,将条件插入Criteria表。在创建学生记录时,您也可能同时捕获他们的类和标准,这会将他们的记录插入到Progress表中(最初为0表示目前为止的进度)。您可能还想要一个更新语句,以允许管理员更新任何给定学生的Progress表。
无论如何,希望这足以让你不必为每个学生或每个班级等创建一个表格。
答案 1 :(得分:0)
嗯,第一,您必须创建数据库和表(或者您可以稍后使用C#创建它)。您必须使用资源文件将C#与SQL连接,这类似于此示例
Provider=XXXXXX.DataSource.1 ; Data Source=XXXX.XXXX.XXXX.CXXX;
Persist Security Info=True;User ID=XXXXX;pASSWORD=XXXXXX;
Initial Catalog=XXXXX;Force Translate=0;
Catalog Library List=XXXXXX,XXXXX
然后创建一个SQLConnection对象,使用此方法创建连接
CreateConnection()
使用此方法选择放在resx文件(或参考资料)中的文件:
`NameOfObject.ConnectionString = ConnStr();
并使用此方法将其打开NameOfObject.Open();
现在你可以使用这种结构插入,删除,执行查询,最后你必须得到这样的代码:
SqlConnection sqlConnection1 = new SqlConnection("Your Connection String"); //Here you can put the string that you'll use in your resx file
SqlCommand cmd = new SqlCommand(); //Initialize the command object for executing instructions (queries)
SqlDataReader reader;
cmd.CommandText = "INSERT INTO TABLE_NAME_HERE VALUES (" + nameYouWillExtractFromTheUser + ")";
cmd.CommandType = CommandType.Text; //We say that the command is a textType
cmd.Connection = sqlConnection1; //Initiate the connection
sqlConnection1.Open(); //Opens the connection
reader = cmd.ExecuteReader(); //Execute the connection