【问题标题】:A Type (Class) As Placeholder? (Avoiding Copy/Paste)类型(类)作为占位符? (避免复制/粘贴)
【发布时间】:2012-02-17 14:39:20
【问题描述】:

我有这个代码:

 OracleConnection myOracleConnection = new OracleConnection(connectionString);
 myOracleConnection.Open();
 OracleCommand command = myOracleConnection.CreateCommand();
 command.CommandText = 
      SchemaDifferenceFinder.Model.SQLStatements.MissingTables.DropTable;
 command.CommandType = System.Data.CommandType.Text;
 command.ExecuteNonQuery();
 myOracleConnection.Close();  

在第 4 行,您可以找到“MissingTables”。那是一个

这个整个代码会重复7次,一切都一样,只是这个类发生了变化,例如:“MissingColumns”。但我不想复制/粘贴整个代码,只是为了替换 this 琐事。

我能做什么?有泛型的东西?如果需要,我也可以传递参数等。感谢每个解决方案!

【问题讨论】:

  • 它变成了什么?也许你可以发布第二次重复的样子(两个 sn-ps)
  • 代替 MissingTables,MissingColumns,仅此而已
  • 我没有看到你只是将它分配给一个字符串! command.CommandText 提供的两个答案都对你有用。

标签: c# class generics types


【解决方案1】:
private static void ExecuteSQL(string SQL)
{
  OracleConnection myOracleConnection = new OracleConnection(connectionString);
  myOracleConnection.Open();
  OracleCommand command = myOracleConnection.CreateCommand();
  command.CommandText = SQL;
  command.CommandType = System.Data.CommandType.Text;
  command.ExecuteNonQuery();
  myOracleConnection.Close(); 
}

然后可以通过以下方式调用:

Helper.ExecuteSQL(SchemaDifferenceFinder.Model.SQLStatements.MissingTables.DropTable);

【讨论】:

  • OWASP 2010 年头号漏洞是 SQL 注入,这种方法易受攻击吗?
  • @StuperUser - 可能是。取决于传入的命令及其构建方式。它看起来像一个无法更改的字符串资源,因此在这种情况下应该是安全的。
  • @StuperUser 我完全取决于你的 SQL 来自哪里,如果它来自 URL,那么是的。如果它在您的应用中被硬编码,则不会。
【解决方案2】:

您不需要泛型 - 只需一个将命令文本作为参数的包装方法。

private void ExecuteNonQuery(string commandText, string connString)
{
    using(OracleConnection myOracleConnection = new OracleConnection(connString))
    {
        myOracleConnection.Open();
        OracleCommand command = myOracleConnection.CreateCommand();
        command.CommandText = commandText;
        command.CommandType = System.Data.CommandType.Text;
        command.ExecuteNonQuery();
    }
}

注意使用using statement 以确保正确处理。

【讨论】:

    【解决方案3】:

    你为什么不直接把代码放到一个带有字符串参数的方法中呢?像这样?

        /// <summary>
        /// Executes the provided CommandText against the Oracle database.
        /// </summary>
        /// <param name="commandText">The command to execute</param>
        /// <exception cref="ArgumentNullException">Thrown if an empty or null commandText is provided</exception>
        private void ExecuteOracleTextCommand(string commandText)
        {
            if(string.IsNullOrWhiteSpace(commandText)
            {
                throw new ArgumentNullException("commandText", "Please provide a valid command");
            }
            //other commandText validation here...
    
            OracleConnection myOracleConnection = new OracleConnection(connectionString);
            myOracleConnection.Open();
            OracleCommand command = myOracleConnection.CreateCommand();
            command.CommandText = commandText;
            command.CommandType = System.Data.CommandType.Text;
            command.ExecuteNonQuery();
            myOracleConnection.Close();
        }
    

    那么你可以这样称呼它:

    ExecuteOracleTextCommand(SchemaDifferenceFinder.Model.SQLStatements.MissingTables.DropTable);
    

    【讨论】:

      【解决方案4】:

      如果您想对来自调用者的命令进行更多控制,另一个答案:

      private delegate void CommandAction(OracleCommand command);
      private static void ExecuteNonQuery(CommandAction action)
      {
        OracleConnection myOracleConnection = new OracleConnection(connectionString);
        myOracleConnection.Open();
      
        OracleCommand command = myOracleConnection.CreateCommand();
        action(command);
        command.ExecuteNonQuery();
        myOracleConnection.Close(); 
      }
      

      然后可以通过以下方式调用:

      Helper.ExecuteNonQuery(command =>
      {
        command.CommandText = SchemaDifferenceFinder.Model.SQLStatements.MissingTables.DropTable;
        command.CommandType = System.Data.CommandType.Text;
      });
      

      【讨论】:

        猜你喜欢
        • 2022-01-15
        • 1970-01-01
        • 2019-06-07
        • 2016-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-13
        • 2011-03-05
        相关资源
        最近更新 更多