MySQL表名作为参数

本文关键字:参数 MySQL | 更新日期: 2023-09-27 18:18:34

我正在尝试设置,以便将表名称作为参数传递给命令文本,但我没有让它工作。我已经看了一下,发现这样的问题:参数化查询MySQL与c#,但我没有任何运气。

这是相关代码(connection ==包含连接字符串的MySqlConnection):

public static DataSet getData(string table)
{
    DataSet returnValue = new DataSet();
    try
    {
        MySqlCommand cmd = connection.CreateCommand();
        cmd.Parameters.AddWithValue("@param1", table);
        cmd.CommandText = "SELECT * FROM @param1";
        connection.Open();
        MySqlDataAdapter adap = new MySqlDataAdapter(cmd);
        adap.Fill(returnValue);
    }
    catch (Exception)
    {   
    }
    finally
    {
        if (connection.State == ConnectionState.Open)
            connection.Close();
    }
    return returnValue;
}

如果我改变:

cmd.CommandText = "SELECT * FROM @param1";

:

cmd.CommandText = "SELECT * FROM " + table;

作为测试的一种方式,这是有效的(我正在从数据集编写xml到控制台进行检查)。所以我很确定问题是用错误的方式使用参数函数。指针吗?

另外,如果我错了,请纠正我,但是使用Parameter功能应该提供针对SQL注入的完整保护,对吗?

MySQL表名作为参数

您可以参数化您的表名,列名或任何其他数据库对象。只能参数化您的值。

您需要将其作为字符串连接传递到sql查询中,但在此之前,我建议使用验证或白名单(仅固定可能的正确值)。

另外,如果我错了,请纠正我,但使用参数功能应该提供针对SQL注入的完整保护,对吧?

如果你指的是具有"参数功能"的参数化语句,是的,这是正确的。

顺便说一下,请注意,有一个叫做动态SQL的概念支持SELECT * FROM @tablename,但不推荐使用。

正如我们所看到的,我们可以在dynamic的帮助下使这个过程工作SQL,但也应该清楚的是,我们没有获得任何优势在存储过程中生成动态SQL。你可以以及从客户端发送动态SQL。那么,OK: 1)如果SQL语句非常复杂,你可以节省一些网络流量封装。2)正如我们所看到的,从SQL 2005开始有处理权限的方法。

人们想要参数化的原因似乎有几个表名。一个阵营似乎是SQL新手有编程经验,但有c++、VB等其他语言的经验等等,参数化是件好事。参数化表命名来实现泛型代码并增加可维护性就像优秀程序员的美德。

但是当涉及到数据库对象时,这是一个古老的真理不成立。在正确的数据库设计中,每个表都是唯一的它描述了一个唯一的实体。(或者至少应该如此!)当然,它。最后有十几个或更多的查表不是很少见吗有一个id、一个名称列和一些审计列。但是确实如此描述不同的实体,其相似之处应视为仅仅是偶然的机会,未来的需求可能会使表更加不同。

使用表名作为参数是不正确的。SQL中的参数只适用于值,而不是列或表的标识符。

一个选项可以使用SqlCommandBuilder Class,这将逃避您的表名,不容易受到SQL注入:

SqlCommandBuilder cmdBuilder = new SqlCommandBuilder();
string tbName = cmdBuilder.QuoteIdentifier(tableName);

你可以在你的语句中使用tbName,因为它现在不容易受到SQL注入。