C# 创建表名为变量的表

C# 创建表名为变量的表,c#,sql,database,C#,Sql,Database,我正在为一所学校创建一个进度跟踪器 进度跟踪器存储每个学生在不同线程中的分数和线程中的标准 我目前计划在每个班级(学生)中使用一个表来存储每个线程中的进度,然后在每个线程中使用一个表来存储该线程中每个标准中的进度 我无法知道学校将有多少类(表),因此我需要找到某种方法,允许管理员帐户使用管理员指定的名称创建类(表) 我想到的最简单的方法是在创建时使用变量作为表名,但是有更好的方法吗?您可以这样做,但正如D Stanley所强调的,您不能使用参数作为表名。因此,如果要将用户的输入用作表名,则无法将

我正在为一所学校创建一个进度跟踪器

进度跟踪器存储每个学生在不同线程中的分数和线程中的标准

我目前计划在每个班级(学生)中使用一个表来存储每个线程中的进度,然后在每个线程中使用一个表来存储该线程中每个标准中的进度

我无法知道学校将有多少类(表),因此我需要找到某种方法,允许管理员帐户使用管理员指定的名称创建类(表)


我想到的最简单的方法是在创建时使用变量作为表名,但是有更好的方法吗?

您可以这样做,但正如D Stanley所强调的,您不能使用参数作为表名。因此,如果要将用户的输入用作表名,则无法将其参数化,因此这是一个非常糟糕的主意。这将立即为您打开SQL注入的大门,这从来都不是一个好计划

<> P>即使对用户的输入进行严格的清理,也有太多的变量需要考虑,这无疑需要比预期更多的工作,并且可能仍然容易受到SQL演进的攻击。 我建议将你的问题改写为也许给出你的应用程序试图实现的总体想法,看看是否有其他方法,而不必为每个用户创建一个表

更新

根据您对问题的重新编写,听起来您需要考虑所需的数据库结构。我很想得到以下表格:

  • 学生,每个学生1个条目,主键为StudentId
  • 类-每个类有一个条目,主键为ClassId
  • Criteria-每类标准1个条目,CriteriaId的主键
  • 进度-每个学生可能有多个条目引用StudentId、ClassId、CriteriaId和分数(可能是ClassScore和CriteriaScore)
然后,您可以对进度表进行查询,根据学生的Id、Id和ClassId或进一步的Id、ClassId和CriteriaId等提取学生的进度

在允许管理员创建自己的查询方面,您只需创建查询,允许管理员将学生记录插入学生表,将类插入类表,并将条件插入条件表。在创建学生记录时,您可能还同时捕获了他们的班级和标准,这将把他们的记录插入进度表(到目前为止的进度最初为0)。您可能还需要一个update语句来允许管理员更新任何给定学生的进度表


无论如何,希望这是一个足够的指针,使您不必为每个学生或每个班级等创建一个表。

首先,您必须创建数据库和表(或者您可以稍后使用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

为什么要为每个用户创建表?为什么不只拥有一个主表和一个描述用户的列呢?基于用户输入创建表似乎不是一个好主意。但要回答您的问题,您只需使用占位符为表名构建适当的SQL语句,并插入表名(例如,使用
string.Format
)-您不能将参数用于表名。@DStanley Heya,谢谢您的回答。该计划是一个学校的进度跟踪程序,我将学生进度存储在表格中。一个类就是一个表,用户需要能够创建类。您能否提供一个示例,说明如何使用所述方法创建表?我对c#不是很熟练,也不确定这会如何工作。谢谢:)当你说一个班就是一个表时,你是指c#类还是实际的类,例如英语或数学?不要这样做-创建一个名为“类”的表,并从进度表到类表创建一个外键。除非您有很好的理由创建多个相同的表,否则这是一个糟糕的设计。