作为占位符的类型(类)?(避免复制/粘贴)

本文关键字:复制 粘贴 占位符 类型 | 更新日期: 2023-09-27 18:21:27

我有这个代码:

 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"。但我不想复制/粘贴整个代码,只想替换这个小东西。

我能做什么?有仿制药吗?如果需要的话,我也可以通过参数等。感谢每一个解决方案!

作为占位符的类型(类)?(避免复制/粘贴)

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);

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

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语句以确保正确处理。

为什么不将代码放入一个带有字符串参数的方法中?像这样的东西?

    /// <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);

如果您想对调用方的命令有更多的控制权,另一个答案是:

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;
});