当前位置: 首页 > 面试题库 >

MySQL表名称作为参数

谭泉
2023-03-14
问题内容

我正在尝试进行设置,以便将表名作为参数传递给命令文本,但是我无法使其正常工作。我四处张望,发现了这样的问题:使用C#进行MySQL的参数化查询,但是我没有任何运气。

这是相关的代码(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注入的完全保护,对吗?


问题答案:

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

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

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

如果用“参数功能”
表示参数化语句,是的,这是正确的。

顺便说一下,请注意,有一个称为动态SQL支持的概念,SELECT * FROM @tablename但不建议这样做。

正如我们已经看到的,我们可以在动态SQL的帮助下使该过程正常工作,但是也应该清楚,在存储过程中生成该动态SQL并没有获得任何好处。您也可以从客户端发送动态SQL。因此,可以:1)如果SQL语句非常复杂,则可以节省一些网络流量并进行封装。2)如我们所见,从SQL
2005开始,有一些处理权限的方法。 然而,这是一个坏主意。

人们想要参数化表名似乎有几个原因 。一个阵营似乎是对SQL编程不熟悉的人,但是他们从其他语言(例如C
++,VB等)中受益匪浅,其中参数化是一件好事。参数化表名称以实现通用代码并增加可维护性似乎是程序员的美德。

但是,就数据库对象而言,古老的真理并不成立。在适当的数据库设计中,每个表都是唯一的,因为它描述了唯一的实体。(或者至少应该如此!)当然,最后要得到一打或更多的查找表,这些查找表都有一个id,一个name列和一些审计列,这并不少见。但是它们确实描述了不同的实体,并且它们的相似之处仅应视为偶然,并且将来的要求可能会使表格更加不同。



 类似资料:
  • 问题内容: 这是我的问题:我想检查名称已参数化的表中的行,如。X的值来自另一个表,例如,在我的主表中,我有一列和一列X,要连接的表的名称为table_X,毫无疑问,它存在,并且具有相同的column ,我将其连接,以检查该表中是否有值。 我尝试过一个视图,但是没有成功,因为我无法在视图中放置参数化的表名。我可以参数化where子句和其他东西,但是没有表名。 我已经尝试过一个程序 PREPARE s

  • 问题内容: 我已经写了一个存储过程。除了将表名作为输入参数之外,它都工作正常。 让我们在MySQL中查看我的proc: 存储过程的调用参数: 在这里,服务名称参数可以正常工作。但是,如果我将newsInfoTable变量作为表输入参数包括在内,则会显示错误。 表’db_test.newsinfotable’不存在 为什么只对表参数发生这种情况?如何从此错误中检索或 如何将表名作为参数传递给存储过程

  • 问题内容: 我想在Postgres函数中将表名作为参数传递。我尝试了这段代码: 我得到了这个: 这是我更改为此时遇到的错误: 可能有效,因为如果没有where 得到的部分1,则表示已选定某项。为什么第一个工作和第二个工作不能同时进行?以及如何解决呢? 问题答案: 这可以进一步简化和改进: 使用架构限定名称进行调用(请参见下文): 或者: 要点 使用OUT参数简化功能。您可以直接选择动态SQL的结果

  • 我在DataFlow上执行了一个apache_beam模板。我需要传递要写入的文件的名称作为模板参数。类似于 的值可以通过PipelineOptions访问,如下所示 如果需要在中使用 这是不允许的,因为我们只能将作为运行时值读取,如果我们试图将此代码部署为模板,就会引发错误。 考虑到这是一个非常常见的用例,我假设可能有一个通用的库或解决方案。有人在附近工作吗?

  • 问题内容: 这可能吗?例如 如果没有,我应该这样做吗: 还是我需要学习其他技巧? 问题答案: 表名和列名不能用PDO中的参数替换。请参见PHP PDO语句可以接受表名或列名作为参数吗?

  • 问题内容: 我有一个看起来像这样的mysql表: 我希望能够查询得到多行,每一列一个。例如: 这会给我: 我需要用什么来制定这样的查询? 问题答案: 您必须首先将每个指定字段的数据应用于结果。 询问 签 出 SQLFIDDLE