MySQL表名作为参数我正在尝试设置,以便将表名作为参数传递给命令文本,但我没有让它工作。我环顾四周,发现了这个问题:ParameterizedqueriestoMySQLinC#,但我没有运气。这是相关代码(connection==MySqlConnection包含连接字符串):publicstaticDataSetgetData(stringtable){DataSetreturnValue=newDataSet();尝试{MySqlCommandcmd=connection.CreateCommand();cmd.Parameters.AddWithValue("@param1",table);cmd.CommandText="SELECT*FROM@param1";connection.Open();MySqlDataAdapteradap=newMySqlDataAdapter(cmd);适应性填充(返回值);}catch(Exception){}finally{if(connection.State==ConnectionState.Open)connection.Close();}返回返回值;如果我改变:cmd.CommandText="SELECT*FROM@param1";to:cmd.CommandText="SELECT*FROM"+table;作为一种测试方法,它有效(我正在将xml从数据集写入控制台以进行检查)。所以我很确定问题只是以错误的方式使用了参数函数。任何指针?另外,如果我错了,请纠正我,但是使用参数函数应该提供完整的SQL注入保护,对吗?您不能参数化表名、列名或任何其他数据库对象。您只能参数化您的值。您需要在sql查询中将其作为字符串连接传递,但在此之前,我建议您进行强验证或白名单(只有一组固定的可能正确值)。另外,如果我错了,请纠正我,但是使用参数函数应该提供完整的SQL注入保护,对吧?如果您指的是带有“参数函数”的参数化语句,是的,这是正确的。顺便提一下,有一个概念叫动态SQL,支持SELECT*FROM@tablename但不推荐。如我们所见,我们可以在动态SQL的帮助下使这个过程工作,但也应该清楚的是,我们在存储过程中生成动态SQL没有任何优势。您还可以从客户端发送动态SQL。所以,ok:1)如果SQL语句很复杂,可以节省一些网络流量,封装起来。2)如我们所见,自SQL2005以来,有多种方法来处理权限。然而,这是一个坏主意。人们想要参数化表名似乎有几个原因。一个阵营似乎是刚接触SQL编程,但对其他语言如C++、VB等有经验的人,参数化是个好东西。参数化表名以启用通用代码并提高可维护性似乎是程序员的良好美德。然而,当涉及到数据库对象时,古老的真理并不适用。在适当的数据库设计中,每个表都是唯一的,因为它描述了一个唯一的实体。(或者至少应该如此!)当然,最终得到十几个或更多的查找表都具有id、name列和一些审计列的情况并不少见。但它们确实描述了不同的实体,它们的出现应该被视为一个机会,未来的需求可能会使表格更加不同。使用表名作为参数是不正确的。SQL中的参数只适用于值而不适用于列或表的标识符。一种选择是使用SqlCommandBuilder类,这将转义您的表名并且不易受到SQL注入的攻击:SqlCommandBuildercmdBuilder=newSqlCommandBuilder();字符串tbName=cmdBuilder.QuoteIdentifier(tableName);您可以在语句中使用tbName,因为它现在不易受到SQL注入攻击。以上就是C#学习教程:MySQL表名作为参数的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
