2017-08-13 52 views
0

我在OleDb中用作参数的表名有问题。当我看到类似问题的论坛时,我发现实际上不可能以这种方式使用参数。但是这个问题没有得到解决。当然,我可以使用实际的表名,但有很多,所以分开处理必要的表更容易。我试图使用动态SQL只是字符串连接,这会导致SQL注入问题。所以,这里是我的代码C#OleDb中的参数化查询。不完整的查询问题

foreach (String Data in tablelist) 
     { 
      if (Data == "Harvard") 
      { 
       cmd.Parameters.Add("@tablename", OleDbType.Char); 
       cmd.Parameters["@tablename"].Value = Data; 
       cmd1.Parameters.AddWithValue("@University", Data); 
       cmd.CommandText = "insert into @tablename ([Firstname],[Lastname]) values (?,?)"; 
      } 
     } 

既然我不能使用INSERT INTO参数哪个命令我应该使用没有陷入困境的命令语句。这个难题如何克服?在此先感谢

+0

你从哪里得到的表名?如果你提供了一个名字白名单,用户可以选择,而没有任何编辑的可能性,那么基于恶意用户输入你可以很安全地使用Sql Injection。因此,您可以在此上下文中使用字符串连接 – Steve

+1

您不能在sql中参数化标识符。即使可以,您的代码也会导致任何不包含FirstName和LastName列的表的异常。事实上,你的问题中的代码根本没有意义 - 你的表名是硬编码的,但你试着用命名参数来使用它(尽管OleDb不支持命名参数),而你将相同的数据插入两个参数。 –

+0

感谢您的澄清。你的意思是用户编辑名字的可能性。据我所知,处理它的唯一方法是使用字符串连接使用名称的白名单。就我而言,用户只需从列表中选择表名(实际上是从组合框中选择),然后代码就可以对其进行处理。 @Steve – PeterEliot

回答

0

你将不得不以连接SQL和表名,如:

cmd.CommandText = "insert into " + Data + " ([Firstname],[Lastname]) values (?,?)";